2015-07-21 202 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

相關問題