2013-05-18 41 views
1

我有一个变种有一些文字之间寻找文字:关键短语

<cfsavecontent variable="foo"> 
element.password_input= 
<div class="holder"> 
<label for="$${input_id}" > $${label_text}</label> 
<input name="$${input_name}" id="$${input_id}" value="$${input_value}" type="password" /> 
</div> 
# END element.password_input 
element.text_input= 
<div class="ctrlHolder"> 
<label for="$${element_id}" > $${element_label_text}</label> 
<input name="$${element_name}" id="$${element_id}" 
value="$${element_value}" type="text" 
class="textInput" /> 
</div> 
# END element.text_input 
</cfsavecontent> 

,我试图通过VAR解析让所有不同的元素类型在这里的是我到目前为止:

ar = REMatch("element\.+(.*=)(.*?)*", foo) 

但它只给我这个部分:

element.text_input= 
element.password_input= 

任何帮助将不胜感激。

回答

5

您的直接问题是,默认.不包括换行符 - 您需要在您的正则表达式中使用标志(?s)来执行此操作。

但是,简单地启用该标志仍然不会导致您目前的正则表达式执行您期望的操作。

一个更好的正则表达式是:

(element\.\w+)=(?:[^##]+|##(?! END \1))+(?=## END \1) 

你会然后做ListFirst(match[i],'=')ListRest(match[i],'=')得到的名称和值。 (重新匹配不会返回捕获的组)。

(显然以上#分别被加倍逃避他们CF.)


解剖上述正则表达式是:

(element\.\w+)= 

element.匹配和任何字母数字,把它放成捕获组1,然后匹配=字符。

(?: 
    [^##]+ 
| 
    ##(?! END \1) 
)+ 

匹配(使用负先行(?!...))和引用捕获组1(\1),则重复多次,可能的任何数量的非散列字符,或不进行结束令牌的哈希(+ ),使用非捕获组((?:...))。

(?=## END \1) 

先行(?=...)确认变量的结束标记存在。

+0

非常感谢你,你太棒了! – user2397715