2010-04-19 13 views
6

wydaje mi się zmusić go do pracy z następującym regexp przez preg_match():Wyrażenie regularne pasujące do nieujemnych liczb całkowitych w PHP?

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

Jednak to dziwne, że pasuje „-0”, biorąc pod uwagę nie ma „-” wolno w ogóle w regexp. Czemu?

Co więcej dziwne jest to, że po przełączeniu części podzielonych według |:

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

To pasuje do wszystkich ujemnych liczb całkowitych, takie jak „-2” i „-10”, itp

co ja Brak tu? Jakiekolwiek lepsze wyrażenie regularne dla nieujemnej liczby całkowitej?

Odpowiedz

5

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

  1. mówi zgodnymi numer, który rozpocznie z 1-9 następnie dowolną cyfrę 0 lub więcej razy ANI
  2. mecz tych numerów, które kończą się 0.

Najwyraźniej -0 spełnia warunek 2, więc otrzymasz mecz.

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

który pasuje 0 lub innego +ve numer bez wiodącym 0. Jeśli dopuszczenie 0 jest dozwolone, wszystko, co musisz sprawdzić, to czy wejście zawiera cyfry, których możesz użyć: ^\d+$, o czym wspomina Mark.

także dlaczego nie po prostu zrobić prostą kontrolę jak:

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

Dzięki! To działa. :) –

+0

Można również sprawdzić, czy * zaczyna się od zera * przypadku z wyprzedzeniem, np. '/^(?! 0) \ d + $/D' (Nie zapomnij o modyfikatorze' D'!) – salathe

Powiązane problemy