正则表达式匹配模式,除非它以特定字符串结束

时间:2015-07-21 03:34:49

标签: php regex

我遇到一个针对我的特殊情况的正则表达式有点麻烦。这就是我所拥有的。

"#<call:(\d+)>(?:(?!\/MM).)+?(\s+)?(?=\<)#ims"

我需要匹配以下示例。

<call:5>anything <

但我不想与此相符......

<call:5>anything/mm <

这工作正常,但问题是它不符合这个......

<call:5>anything/mmm <

我需要正则表达式匹配anything,前提是anything不以/mm结尾。我知道它会变得很小我忽视了,但是你能指出我做错了吗?

2 个答案:

答案 0 :(得分:1)

如果可以假设要匹配的call标记内容不包含

  • (允许?)/mm字符串或
  • 之后的空格
  • <个字符(最后除外),

以下似乎有效:

<call:(\d+)>(?:(?!\/mm[\s<]).)+?(\s+)?(?=\<)

修改

我认为角落案例也可以解决,请尝试这样做:

<call:(\d+)>(?:(?!\/mm\s*?<).)+?(\s+)?(?=\<)

答案 1 :(得分:0)

你想说的是,如果匹配以/mm <结尾,那么它是无效的吗?

if (preg_match('%<call:(\d+)>(?!.*/mm <\z)(.*)%sim', $subject)) {
    # Successful match
} else {
    # Match attempt failed
}

如果所有行都以/ m或/ mmm结尾并且您想要“任何”,则可以添加此'%<call:(\d+)>(?!.*/mm <\z)(.*)(?:/m+ <)%sim'