[英]ignore nested results in preg_match_all
我想對兩個大括號中第一次出現的字符進行匹配,但是忽略其中的字符。
{{some text here {{nested text here}} another text {{another nested text here}} final text}}
所以結果一定是
some text here {{nested text here}} another text {{another nested text here}} final text
但是這個搜索
preg_match_all("^\{{(.*?)\}}^", $string, $results);
給我第一對括號內的:
$results[0][0] = nested text here
$results[0][1] = another nested text here
有什么辦法可以通過preg_match_all來實現?
嵌套結構通常會導致正則表達式出現問題(因為它們使匹配的語言比正則表達式更復雜)。 PCRE是其中一種引擎,它允許匹配它們,因為它支持遞歸。 如果雙括號內從來沒有單個大括號,則可以使用以下模式:
'/\{\{[^{}]*(?:(?R)[^{}]*)*\}\}/'
其中(?R)
再次將整個模式嵌套在其內部。
我不確定PCRE的優化程度如何,但是您可以通過使所有重復都具有所有權來提供一些幫助。 因為所有連續的重復都是互斥的,所以可以抑制回溯,在這里沒有必要。
'/\{\{[^{}]*+(?:(?R)[^{}]*+)*+ \}\}/'
如果允許使用單括號,則可以使用先行方式進行類似的操作,但這已經說明了為什么實際上並沒有為嵌套結構創建正則表達式(即使引擎支持):
'/\{\{(?:(?!\{\{|\}\}).)*(?:(?R)(?:(?!\{\{|\}\}).)*)*\}\}/'
現在,我們允許重復任何字符,而不是非{}
字符,除非它標志着{{
或}}
的開頭。 同樣,使其具有占有欲可能是一個好主意:
'/\{\{(?:(?!\{\{|\}\}).)*+(?:(?R)(?:(?!\{\{|\}\}).)*+)*+\}\}/'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.