忽略preg_match_all输出中的字符

时间:2014-09-22 15:36:13

标签: php regex match

我有这个正则表达式:

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

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

我不想这样做:

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

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

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

那么有一种更简单的方法可以从正则表达式中的$ matches中删除花括号吗?

3 个答案:

答案 0 :(得分:7)

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


这将我们带到这个表达式:

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

Demo


以同样的方式实施:

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

@CasimirEtHippolyte提出了一个很好的观点。这是一个很好的例子,说明了懒惰的点匹配 - 所有这些都不是必需的,并且可能会通过回溯来降低性能。您可以将.*?替换为[^}]*,以匹配0 +非}个字符。

答案 1 :(得分:3)

{之后的reset以及不是}的匹配字符。如果{}达到平衡,则不需要另一个}

{\K[^}]*

请参阅example on regex101

答案 2 :(得分:2)

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

用此替换你的正则表达式。这样可以。