2013-03-07 148 views
0

我想寫一個匹配包含特定子字符串的字符串的正則表達式,但如果它也包含不同的子字符串,則會失敗。我找到了this answer,但我不確定如何讓它滿足我的需求。爲了儘可能具體:正則表達式匹配包含子字符串,但不包括子字符串的字符串

  • 是的,它必須做到這一點作爲表達的一部分。我無法訪問將要處理的代碼。
  • 是的,它需要是一個表達式。
  • 它需要使用PHP的正則表達式。我很確定它正在使用preg進行評估

爲了說明我正在嘗試做什麼,我有一組我想要過濾的URL。我想匹配其中包含「/ somedir」的網址,但如果網址中還包含「somestring」,我不希望它匹配。

所以,

  • www.somesite.com/somedir/index.html
  • www.somesite.com/somedir/somotherdir/index.html
  • www.somesite.com/somedir/ somepage.html

都會匹配,但是,

  • www.somesite。 COM/somedir/somestring.html
  • www.somesite.com/somedir/somestring/index.html

會都失敗。

+1

爲什麼正則表達式? 「strpos」的簡單組合將起作用。 – Tchoupi 2013-03-07 17:37:39

+0

*「我很確定它正在使用preg進行評估」* - 在詢問之前您應該知道,因爲它不同(很可能您是對的,但是,很好,找出;)) - 也是使用模式的代碼是必要的,因爲它可以區分使用正則表達式的方式。你也應該概述你到目前爲止所嘗試的。例如。模擬你自己的代碼,提供數據運行,輸出結果,使模式變成一個變量,然後嘗試。 – hakre 2013-03-07 17:39:37

+0

http://stackoverflow.com/questions/2953039/regular-expression-for-a-string-containing-one-word-but-not-another – Crisp 2013-03-07 17:41:49

回答

0

你需要一個正則表達式,將接受某種模式只有如果它沒有被其他模式所包圍:

~ 
    (?(DEFINE) 
     (?<ACCEPT> must-contain-pattern) 
     (?<REFUSE> must-not-contain-pattern) 
    ) 

    ^
     (?:(?!(?&REFUSE)).)* 
      (?&ACCEPT) 
     (?:(?!(?&REFUSE)).)* 
    $ 
~ux 

DEFINE塊根據自己的需要定義ACCEPTREFUSE模式,這應該工作。

編輯:從上面量身定做通過定義兩個命名的子模式你的情況的模式:

~ 
    (?(DEFINE) 
     (?<ACCEPT> \Q/somedir\E) 
     (?<REFUSE> \Qsomestring\E) 
    ) 

    ^
     (?:(?!(?&REFUSE)).)* 
      (?&ACCEPT) 
     (?:(?!(?&REFUSE)).)* 
    $ 
~ux 
+0

這個問題看起來像很多工作,當問題的答案Crisp與作品相關時。除此之外,我不能使用多個表達式。 – AWarnock 2013-03-07 18:09:41

+0

很多工作?多個表達式?完全不是因爲定義,這是一個表達式,而不是多個表達式。你可能不明白它是如何工作的,我通過編輯答案給你一個例子。這意味着你可以輕鬆採用它。那麼希望它更清楚。 – hakre 2013-03-07 18:17:24

相關問題