簡體   English   中英

忽略preg_match_all輸出中的字符

[英]Ignore characters in preg_match_all output

我有這個正則表達式:

preg_match_all('/{.*?}/', $html, $matches);

返回所有寫在花括號內的字符串。 $ matches變量也包含{和}字符。 我該如何刪除它們?

我不想這樣做:

if ($matches[0] == "{variable}")

而且我不想在正則表達式中添加(和)字符,因為我不想使用:

preg_match_all('/{(.*?)}/', $html, $matches);
if ($matches[0][0] == "variable")

那么是否有更簡單的方法從正則表達式中的$ matches中刪除花括號?

在PCRE(PHP的regex實現)中,您可以使用lookarounds來執行零長度斷言。 lookbehind (?<=...)將確保表達式出現在內部指針后面。 前瞻(?=...)將確保表達式發生在內部指針之前。 如果需要,這些都可以被否定: (?<!...)(?!...)


這給我們帶來了這樣的表達:

(?<={).*?(?=})

演示


以同樣的方式實現它:

preg_match_all('/(?<={).*?(?=})/', $html, $matches);
// $matches[0] = 'variable';

@CasimirEtHippolyte提出了一個很好的觀點。 這是一個很好的例子,說明了懶惰的點匹配 - 所有這些都不是必需的,並且可能會通過回溯來降低性能。 你可以替換.*? 使用[^}]*匹配0+非}字符。

或者在{和匹配字符之后重置 } ,而不是} 如果{}是平衡的,則不需要另一個}

{\K[^}]*

請參閱regex101上的示例

(?<={).*?(?=})

用這個替換你的正則表達式。這樣可行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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