我有一个var有一些文字:
<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>
Run Code Online (Sandbox Code Playgroud)
而我正在尝试解析var以获取所有不同的元素类型,这是我到目前为止:
ar = REMatch( "element\.+(.*=)(.*?)*", foo )
Run Code Online (Sandbox Code Playgroud)
但它只给了我这个部分:
element.text_input=
element.password_input=
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
您当前的问题是默认情况下.不包含换行符 - 您需要(?s)在正则表达式中使用该标志才能执行此操作.
但是,简单地启用该标志仍然不会导致您当前的正则表达式执行您期望它执行的操作.
一个更好的正则表达式是:
(element\.\w+)=(?:[^##]+|##(?! END \1))+(?=## END \1)
Run Code Online (Sandbox Code Playgroud)
然后你会做ListFirst(match[i],'=')并ListRest(match[i],'=')获得名称和价值.(rematch不会返回捕获的组).
(显然,上面的#s加倍,以逃避CF.)
解析上述正则表达式是:
(element\.\w+)=
Run Code Online (Sandbox Code Playgroud)
匹配element.和任何字母数字,将其放入捕获组1,然后匹配=字符.
(?:
[^##]+
|
##(?! END \1)
)+
Run Code Online (Sandbox Code Playgroud)
匹配任意数量的非哈希字符,或者不跟随结束标记的哈希(使用否定前瞻(?!...))并引用捕获组1 \1(+),使用非捕获组((?:...))重复尽可能多的次数().
(?=## END \1)
Run Code Online (Sandbox Code Playgroud)
前瞻(?=...)确认变量的结束标记存在.