2010-04-19 70 views
6

我似乎得到它通過的preg_match以下的正則表達式()工作:正則表達式以匹配PHP中的非負整數?

@^(?:[1-9][0-9]*)|[email protected] 

然而它的怪異,它匹配「-0」,考慮有沒有「 - 」允許在正則表達式的。爲什麼?

更重要的是奇怪的是,如果你切換除以零件|:

@^0|(?:[1-9][0-9]*)[email protected] 

這一切都負整數匹配,如「-2」和「-10」等

上午什麼我錯過了嗎?任何更好的正則表達式爲非負整數?

回答

5

你的正則表達式:@^(?:[1-9][0-9]*)|[email protected]

  1. 說匹配那些開始 與1-9後跟任何數字0或 多次OR
  2. 匹配那些以0結束數數。

顯然-0滿足條件2,所以你得到的比賽。

您所需要的正則表達式是:@^(?:[1-9][0-9]*|0)[email protected]

它匹配0或不導致0任何其他+ve數量。如果允許前導0,那麼您需要檢查的是輸入是否包含您可以使用的數字:^\d+$作爲標記提及。

而且爲什麼不只是做一個簡單的檢查,如:

if($input >= 0) 
// $input is non -ve. 
+0

謝謝!有用。 :) – 2010-04-19 03:38:27

+0

您也可以檢查*開頭爲零*的情況下,向前看,例如'/ ^(?!0)\ d + $/D'(別忘了'D'修飾符!) – salathe 2010-04-19 08:00:55