[英]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+非}
字符。
(?<={).*?(?=})
用这个替换你的正则表达式。这样可行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.