如果模式在另一个模式中,使用PHP正则表达式可以排除匹配。
正在使用的字符串/模板如下所示:
{employee.name}
{history}
{employee.name}
{/history}
正在使用的PHP正则表达式是:
{employee([A-Za-z0-9\.]+)}
此模式的问题在于它将匹配{employee.name}
两次。如果匹配在{history}*{/history}
内,则需要排除匹配。
答案 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+})
否定前瞻 - 断言无法匹配下面的正则表达式