2015-07-21 88 views
1

对于我的特殊情况,我有一个小小的麻烦来处理正则表达式。这是我的。正则表达式匹配模式,除非它以特定字符串结尾

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

我需要匹配下面的例子。

<call:5>anything < 

但我不想匹配这个...

<call:5>anything/mm < 

这工作不错,但问题是,它不会匹配这个...

<call:5>anything/mmm < 

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

+1

望着正则表达式,我不确定例子中'/ mm'部分的意义是什么 - 所以你基本上想要匹配除'/ mm'之外的任何东西?例如, '/ mmx'也可以匹配?那里有'/ mm x'的空间呢?多重'/'怎么办? – FriendFX

+0

并补充一点,在这里重要的是'space'和'<'字符? – Scuzzy

+0

您的最后一个字符串_' anything/mmm <'_ ...是否应该匹配,或者不是? –

回答

1

如果一个人可以假设call标签的内容进行匹配将不包含

  • 空格的(允许?)/mm串之后或
  • <字符(除了在端),

以下似乎工作:

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

编辑:

我认为角落的情况下,可以作为很好地解决,试试这个:

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

完美!谢谢FriendFX。是的,这些条件永远不会发生,所以你的正则表达式起作用。我知道这会很简单。干杯! – WiLDRAGoN

+0

回复:编辑 - 是的,这也可以,'(?:(?!\/mm \ s?<)。)+?(\ s +)?(?= \ <)'也是。再次感谢。 – WiLDRAGoN

0

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

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

如果在任一/ M全行结束或/嗯,你想“什么”,你可以添加此'%<call:(\d+)>(?!.*/mm <\z)(.*)(?:/m+ <)%sim'

+0

是的,如果比赛以'/ mm'结尾,则无效。 – WiLDRAGoN

+0

不幸的是,Scuzzy,即使转义了'/'。 – WiLDRAGoN

相关问题