1

我有一个 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>

我正在尝试解析 var 以获取所有不同的元素类型,这就是我目前所拥有的:

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

但它只给了我这一部分:

element.text_input=
element.password_input=

任何帮助将不胜感激。

4

1 回答 1

5

您的直接问题是默认情况下.不包含换行符 - 您需要(?s)在正则表达式中使用该标志才能执行此操作。

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

更好的正则表达式是:

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

然后,您将执行ListFirst(match[i],'=')ListRest(match[i],'=')获取名称和值。(重新匹配不返回捕获的组)。

(显然,上面的#s 加倍以将它们转义为 CF。)


上面剖析的正则表达式是:

(element\.\w+)=

匹配element.任何字母数字,将其放入捕获组 1,然后匹配=字符。

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

匹配任意数量的非散列字符,或不跟随结束标记的散列(使用负前瞻(?!...))并引用捕获组 1 ( ) ,使用非捕获组 ( )\1重复尽可能多的次数( )。+(?:...)

(?=## END \1)

提前(?=...)确认变量的结束标记是否存在。

于 2013-05-18T21:52:27.893 回答