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


Regex To Match Pattern Unless It Ends With A Specific String

我遇到了一点麻烦,为我的特殊情况提出一个正则表达式。这是我有的。

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

我需要匹配下面的例子。

<call:5>anything <

但是我不想匹配这个…

<call:5>anything/mm <

工作正常,但问题是它不匹配这个…

<call:5>anything/mmm <

我需要正则表达式来匹配anything,前提是anything不以/mm结束。我知道这是我忽略的一件小事,但你能指出我做错了什么吗?

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

  • 字符后面的空格(允许吗?)/mm字符串或
  • <字符(末尾除外),

下面的代码似乎可以工作:

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

我认为极端情况也可以解决,试试这个:

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

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

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

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