如果在另一个模式中,PHP正则表达式模式排除

时间:2015-08-26 01:09:18

标签: php regex

如果模式在另一个模式中,使用PHP正则表达式可以排除匹配。

正在使用的字符串/模板如下所示:

{employee.name}
{history}
    {employee.name}
{/history}

正在使用的PHP正则表达式是:

{employee([A-Za-z0-9\.]+)}

此模式的问题在于它将匹配{employee.name}两次。如果匹配在{history}*{/history}内,则需要排除匹配。

2 个答案:

答案 0 :(得分:3)

我觉得有用的一种方法是在上下文中使用交替运算符,将左边想要排除的内容放在左侧,( 扔掉它,它是垃圾)并在右侧的捕获组中放置您想要匹配的内容。然后,您可以从$matches[1] ...

中抓取您的匹配项
preg_match_all('~{history}.*?{/history}|({employee[a-z0-9.]+})~si', $str, $matches);
print_r(array_filter($matches[1]));

或者,您可以使用回溯控制动词:

preg_match_all('~{history}.*?{/history}(*SKIP)(*F)|{employee[a-z0-9.]+}~si', $str, $matches);
print_r($matches[0]);

答案 1 :(得分:0)

{employee([A-Za-z0-9\.]+)}(?!\s*{\/\w+})

(?!\s*{\/\w+})否定前瞻 - 断言无法匹配下面的正则表达式