2013-05-18 91 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