我遇到一个针对我的特殊情况的正则表达式有点麻烦。这就是我所拥有的。
"#<call:(\d+)>(?:(?!\/MM).)+?(\s+)?(?=\<)#ims"
我需要匹配以下示例。
<call:5>anything <
但我不想与此相符......
<call:5>anything/mm <
这工作正常,但问题是它不符合这个......
<call:5>anything/mmm <
我需要正则表达式匹配anything
,前提是anything
不以/mm
结尾。我知道它会变得很小我忽视了,但是你能指出我做错了吗?
答案 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'