2011-02-25 35 views
2

我有這樣的代碼的preg_match排除一些

preg_match("/\bHTTP(.)+ (\d{3})/", $string) 

在過去的模式我要檢查,可以通過任何數字組成,但不應該創建像404401,怎一個號碼的3位數我可以做嗎?

回答

5

可以使用式斷言,以確保匹配的字符串沒有一個404401爲:

preg_match("/\bHTTP(.+) (?!404|401)(\d{3})/", $string) 

Rubular Link

+0

作品!如果我找對了,你檢查是否存在401或404,如果他們做的字符串不匹配,但由於它不是「強制性」的正則表達式將繼續,如果不存在。這是唯一的方法還是有辦法實際寫出「3位數字,除了這個3位數字」?這似乎更多的是「解決方法」 – 2011-02-25 21:25:33

1

解釋:

一個負先行?!尋找與指定模式不匹配的文字。 一個積極的lookahead尋找一個模式匹配,但不返回。

http://www.regular-expressions.info/lookaround.html

  • ?!不符合下列 模式
  • 404|401無論是404401,所以|用於替代
+0

但這個「?!」查看401 | 404模式或\ d {3}模式? – 2011-02-25 21:39:26

+0

我不完全確定,但我認爲它的工作方式類似於沒有反向引用的子表達式,並且當它沒有找到404或401時它是成功的,所以匹配很好,並且與其餘部分保持一致。如果它找到其中一個,則匹配失敗,並停止執行3位數搜索。 – Stofke 2011-02-25 22:07:32

1

要排除的更值,則這樣會更復雜,但是

preg_match("/\bHTTP(.+) ([0-35-9]\d{2}|4[1-9]\d|40[0235-9])/", $string) 

將匹配不與4啓動任何三位數字,

,與4開始,但不與40啓動任何三位數字,

任何三位數字,以40開頭,但不是401或404.

+0

謝謝!是不是有一個表達式要排除,比如「^」?在我看來,我認爲這是可能的[0-9^404 | 401){3}。 – 2011-02-25 21:55:03

+0

[^ 0-9]否定範圍內的所有字符 – Stofke 2011-02-25 22:00:53

+1

'[^ ...]'將匹配任何**單個**字符,其** **不匹配「...」表達式(包括字符類別所以'[^ XYZ \ s \ d]'例如匹配非空白字符,非數字字符,既不是X,Y也不是Z的字符)。但它不能與任何其他語法結合來指定一個概念,如「匹配一組字符而不匹配另一組」。也就是說,你不能像'[\ d^4]'做任何事情說'匹配一個數字,但不匹配''4''。 – mob 2011-02-25 22:02:13