2011-05-18 128 views
1

嗨我正在處理一個CMS中的錯誤,我希望有人可以給我一些這個凌亂的正則表達式的幫助!我需要刪除{{頁面中的所有內容? }}標籤(其中'page'是一個動態詞彙),包括任何內嵌的{{tags}} .- {{links? }}PHP的正則表達式忽略嵌套標籤

在下面的代碼中,正則表達式應該刪除{{homepage中的所有內容? }}標籤:

<div id="main"> 
    <div id="left"> 
    {{menu1}}<br /> 

{{homepage? 
    <img src="images/{{timenow}}.gif" width="177" height="217" alt="{{imgname}}" id="biglogo" /> 
}} 

{{links? 
    <b>LINKS</b> 
}} 
</div> 
{{menu2}} 
</div> 

這是我到目前爲止。因爲它看到timenow}}

$result=preg_replace("#\{\{(?!links)\S*?\?.*?}}#s","",$result); 

澄清它變得儘快卡住:

沒有{{page? }}子標籤(所有子標籤都是{{thisformat}})。換句話說就是:{{foo? {{links? bar }} baz }}永遠不會發生。

+0

什麼'{{頁? }}標籤?你的意思是'{{主頁? ...}}'?你真的想刪除鏈接標籤以外的所有標籤嗎? '{{foo? {{鏈接? bar}} baz}}'?或者你只是想抓住鏈接標籤的內容? – Qtax 2011-05-18 14:48:10

+0

's /什麼/什麼將/;' – Qtax 2011-05-18 14:54:37

+0

這可能很簡單,使用'(?R)'語法的遞歸正則表達式。在你的情況下,你可能會逃避:''#\ {\ {(?! links)\ w + \?((?R)|。)*}}#s「' - 但是'.'應該被重寫爲更具體的東西。 – mario 2011-05-18 14:56:00

回答

2

你可以這樣做: #\{\{ (?!links\b) \w+ \? (?: \{\{\w+}} | [^{}]+ | \{(?!\{) | }(?!}))* }}#sx

+0

這是完美的!非常感謝你! – cronoklee 2011-05-18 15:59:26

-2

這是不可能與正則表達式。閱讀關於嘗試使用正則表達式解析嵌套的html/xml失敗的數百萬次嘗試。

+0

他不解析* ML tho,並且匹配遞歸結構很容易,但編寫解析器可能更好。 :) – Qtax 2011-05-18 14:52:27

+0

與正則表達式解析XML的問題是嵌套。 – cweiske 2011-05-18 14:56:46

+0

不要讓標題讓你感到困惑 - 實際上在這個問題中只有一層嵌套,這使得語言變得規則。 – Kobi 2011-05-18 16:01:47

2

如果我理解正確的話,就沒有必要在這裏遞歸匹配; {{page? }}標籤可能包含簡單標籤,如{{this}},就是這樣。在這種情況下,您只需要注意嵌套標籤的開頭,因此您可以在出現標籤時匹配該標籤的末尾,然後繼續查找封閉{{page? }}標籤的結尾或另一個標籤的開頭嵌套標籤。

$regex='# 
    \{\{ (?!links\?) \w++\?  # page-tag start 
    (?: 
    (?: (?!\{\{|\}\}) .)++ # normal content 
    | 
    \{\{      # 
    (?: (?!\}\}) .)*+  # embedded tag 
    \}\}      # 
)*+ 
    \}\}      # page-tag end 
#sx'; 

「正常內容」部分相匹配的一個或多個任意字符,除非下一個字符是一個{{}}序列的開始。一旦我們開始匹配嵌入式標籤,我們就會使用相同的技術來吞噬其內容。

see it in action at ideone.com