簡體   English   中英

忽略preg_match_all中的嵌套結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM