2010-04-19 12 views
6

mi sembra di farlo funzionare con la seguente espressione regolare da preg_match():Espressione regolare per confrontare gli interi non negativi in ​​PHP?

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

Eppure è strano che corrisponda '-0', considerando che ci sono no '-' consentito a tutti nella regexp. Perché?

La cosa più strana è che se si passa le parti divise da |:

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

Esso corrisponde a tutti i numeri interi negativi come ad esempio '-2' e '-10', ecc

Cosa am Mi manca qui? Qualche regexp migliore per numero intero non negativo?

risposta

5

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

  1. dice corrisponde a quei numeri che iniziano con 1-9 seguita da qualsiasi cifra 0 o più volte O
  2. partita quei numeri che terminano con 0.

Chiaramente -0 soddisfa la condizione 2 in modo da ottenere la corrispondenza.

L'espressione regolare che vi serve è: @^(?:[1-9][0-9]*|0)[email protected]

che corrisponde 0 o qualsiasi altro +ve numero senza leader 0. Se gli 0 iniziali sono consentiti, è sufficiente verificare se l'input contiene cifre per le quali è possibile utilizzare: ^\d+$ come indicato da Mark.

anche perché non basta fare un controllo semplice come:

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

Grazie! Funziona. :) –

+0

Si può anche verificare che * inizi con zero * caso con un lookahead, ad es. '/^(?! 0) \ d + $/D' (Non dimenticare il modificatore' D'!) – salathe

Problemi correlati