2017-08-27 51 views
2

考慮項目集合。每個項目可能沒有,分配一個或多個標籤。標記名稱可能由任何有效的unicode字符組成,除了空格(空格,換行符等)。每個項目的tag屬性是空格分隔的標籤列表,例如, tag1 tag2 tag3PHP正則表達式:匹配包含複雜字符集的匹配的若干包含/排除規則

我目前正在研究一個PHP函數,它爲包含特定標記集的人過濾所有項目,另一方面不允許包含其他人。

目前,我產生一個正則表達式像

/^(?=.*\bfoo\b)(?=.*\bbar\b)(?!.*\bbaz\b).*$/ 

了搜索查詢。該表達式匹配包含foobar而不是baz的所有tag屬性。這是完美的,而標籤以單詞字符開始和結束,但以其他方式停止工作(例如,以標記開始或以點號或散列符號結尾的標記)作爲字邊界錨點僅適用於單詞字符

你知道如何修改.foo#等標籤的正則表達式嗎?

該解決方案應該支持PHP 5.5+。

+0

如若'包含.foo#''匹配... FOO#%'或'abc.foo#DEF '或'(SPACES).foo#'? – Toto

回答

2

我想你生成你的模式,如果是的話,你可以使用一種模式是這樣的:

/^(?=.*(\W|^)foo(\W|$))(?=.*(\W|^)bar(\W|$))(?!.*(\W|^)baz(\W|$)).*$/ 

[Regex Demo]

如果不是你可以簡單地得到\bfoo\b\.\bfoo\b#之外的字符。

+0

適合我,謝謝! – muffel

+0

您的歡迎;)。 –

0

工作的示例:

^(?=.*(?<!\S)[email protected](?!\S).*)(?!.*(?<!\S)_bar#(?!\S).*).*

而不是一個單詞邊界之前我和標籤後,已經沒有維護自己的空白。單詞邊界是兩個查找表的組合;在這種情況下,您只需要兩個中的一個(兩次)。

  • 標誌:G,M
  • 步驟:270

Demo

相關問題