2010-05-17 67 views
0

是否有方法在正則表達式I.e中查找自定義標記?匹配在Regexp中查找打開和關閉標記

{a}sometext{/a} 

除了

{c=#fff}sometext{/c} 

所以它找到的內內容的整個塊?問題是sometext可能有其他標籤,如:

{a=http://www.google.com}{b}Hello, world{/b}{/a} 

唯一的解決方案,我可以想出將從匹配{一...到.../B}當我想{A ...到.../a}是否有單一的正則表達式解決方案,或者最好是匹配開始,然後使用另一種方法從備份中找到結尾,並以這種方式抓取它?我使用PHP 5.2,所以我有所有的選擇。

回答

1

聽起來像你正在嘗試做MediaWiki已經用wiki標記語言做的事情。我會建議使用他們的解析器和他們的標記,或者如果您選擇自己推出,您可能會從看到他們如何做到這一點中找到靈感。

Manual for Parser.php

Source for Parser.php

+0

這正是我試圖找到的,謝謝!我試圖推出自己的,學習體驗以及因爲我只想要某些功能。 – Rixius 2010-05-17 03:05:12

2

這工作:

$subject = 'bla bla{a=http://www.google.com}{b}Hello, world{/b}{/a} bla'; 
$regex = '~\\{a(?:=[^}]+)?\\}(.*?)\\{/a\\}~'; 
preg_match($regex, $subject, $matches); 
var_dump($matches); 

給出:

array(2) { 
    [0]=> 
    string(48) "{a=http://www.google.com}{b}Hello, world{/b}{/a}" 
    [1]=> 
    string(19) "{b}Hello, world{/b}" 
} 

BEGIN編輯 你可以做正則表達式的更爲寬泛的反向引用

$regex = '~\\{([a-z]+)(?:=[^}]+)?\\}(.*?)\\{/\\1\\}~'; 

,但在這種情況下,我沒有想法如何匹配任意深度的內部標籤。 END編輯

但是,我強烈建議不要使用正則表達式來達到此目的。我建議你迭代字符串,一次一個數組,並使用輔助堆棧來跟蹤你發現的標籤(使用array_pusharray_popend來查看)。

+0

感謝工作正則表達式,但我不太明白你的建議。如果它會更有效率,那麼我很樂意使用它。你知道有關它的任何文章嗎? – Rixius 2010-05-17 02:55:11

+0

谷歌對於「解析器標籤嵌套堆棧」或類似的東西,你會發現有關如何解析嵌套標籤的文章。 – Artefacto 2010-05-17 03:11:33