Php 忽略preg_match_all输出中的字符

Php 忽略preg_match_all输出中的字符,php,regex,match,Php,Regex,Match,我有一个正则表达式: preg_match_all('/{.*?}/', $html, $matches); 返回写在大括号内的所有字符串。$matches变量还包含{和}字符。我怎样才能移除它们 我不想做: if ($matches[0] == "{variable}") 我不想在regexp中添加(和)字符,因为我不想使用: preg_match_all('/{(.*?)}/', $html, $matches); if ($matches[0][0] == "variable") 那

我有一个正则表达式:

preg_match_all('/{.*?}/', $html, $matches);
返回写在大括号内的所有字符串。$matches变量还包含{和}字符。我怎样才能移除它们

我不想做:

if ($matches[0] == "{variable}")
我不想在regexp中添加(和)字符,因为我不想使用:

preg_match_all('/{(.*?)}/', $html, $matches);
if ($matches[0][0] == "variable")
那么,有没有一种更简单的方法可以从正则表达式中的$matches中删除大括号呢?

在PCRE(PHP的正则表达式实现)中,您可以使用lookarounds来执行零长度断言。向后看,
(?(!…)


这就引出了这个表达:

(?<={).*?(?=})
(?
(?或在
{
之后匹配字符,这些字符不是
}
。如果
{}
是平衡的,则不需要另一个
}

{\K[^}]*

请参见

注意,您可能需要使用
s
修饰符。这将使您的
*?
也匹配换行符。很漂亮!很漂亮!工作起来很有魅力。我希望这不会对正则表达式的性能产生太大的影响。我将在5分钟内接受您的答案。@unska:如果您想提高性能,请更换
*?
[^}]+
@unska相比,它应该对性能的影响最小(如果有的话)。它将以同样的方式工作,但只对
{
进行断言,而不是实际匹配
{
。换句话说,没有“额外”的查找逻辑…或
[^{}]+
为了避免falsevar,在“{falsevar{var1}{var2}}”中,您能否提供对所有这些
\K
,*SPOT等PCRE函数的参考,其中对它们进行了详细的描述。在perl文档中,这不是很重要understandable@vks我加了一个a,你的意思是?Thanx很多。我也会通过这些来学习这些。:):O从未有过这样的新东西。那太棒了。thanx很多。happy regexing:)@Sam因为问题是关于“忽略字符”和php标记,我想至少应该提到
\K
。正如你所说,你的解决方案解释得很好,也更兼容。当然,已经被提升了:)
(?<={).*?(?=})
{\K[^}]*