忽略preg_match_all输出中的字符

uns*_*ska 4 php regex match

我有这个正则表达式:

preg_match_all('/{.*?}/', $html, $matches);
Run Code Online (Sandbox Code Playgroud)

返回所有写在花括号内的字符串.$ matches变量也包含{和}字符.我该如何删除它们?

我不想这样做:

if ($matches[0] == "{variable}")
Run Code Online (Sandbox Code Playgroud)

而且我不想在正则表达式中添加(和)字符,因为我不想使用:

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

那么是否有更简单的方法从正则表达式中的$ matches中删除花括号?

Sam*_*Sam 7

在PCRE(PHP的regex实现)中,您可以使用lookarounds来执行零长度断言.lookbehind,(?<=...)将确保表达式发生在内部指针后面.前瞻,(?=...)将确保表达式发生在内部指针之前.如果需要,这些都可以否定:(?<!...)(?!...).


这给我们带来了这样的表达:

(?<={).*?(?=})
Run Code Online (Sandbox Code Playgroud)

演示


以同样的方式实现它:

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

@CasimirEtHippolyte提出了一个很好的观点.这是一个很好的例子,其中不需要延迟点匹配,并且可能会通过回溯来降低性能.您可以替换.*?with [^}]*以匹配0+非}字符.

  • @unska:如果你想提高性能,用`[^}] +`替换`.*?` (2认同)