2011-02-02 90 views
5

Recientemente descubrí que un método que he estado usando para validar la entrada del usuario acepta algunos valores con los que no estoy particularmente satisfecho. Necesito que solo acepte números naturales (1, 2, 3, etc.) sin caracteres que no sean dígitos.Regex para validar solo números naturales?

Mi método es el siguiente:

function is_natural($str) 
{ 
    return preg_match('/[^0-9]+$/', $str) ? false : $str; 
} 

Así que se supone que debe devolver false si encuentra otra cosa que un número natural entero. El problema es que acepta cadenas como "2.3" e incluso "2.3,2.2"

+4

¿Qué quiere decir "números naturales, pero no hay dígitos"? ¿Cómo quieres los números sin [dígitos] (http://en.wikipedia.org/wiki/Numerical_digit)? –

+0

Esa expresión regular no coincidirá con un punto o una coma. – Koraktor

+0

utilizo 'filter_var': http://stackoverflow.com/a/6563394/2165415 ver el puesto no –

Respuesta

14

Tal vez se puede aclarar la diferencia entre un "número" y un "dígito" ??

De todas formas, puede utilizar

if (preg_match('/^[0-9]+$/', $str)) { 
    // contains only 0-9 
} else { 
    // contains other stuff 
} 

o puede utilizar

$str = (string) $str; 
ctype_digit($str); 
+0

Creo que entendí mal los dígitos. Necesita aceptar solo dígitos. Parece que ctype_digit solo acepta dígitos en forma de cadena, lo necesito para aceptar enteros. –

+0

sí, ctype_digit() funcionará; sin embargo, observe cómo doy $ str como una cadena primero, porque ctype_digit() siempre devolverá falso si le pasa un entero. –

+0

ctype_digit() todavía devuelve TRUE en cadenas como '2.2,2.3' –

14

El problema con /^[0-9]+$/ es que también acepta valores como 0123. La expresión regular correcta es /^[1-9][0-9]*$/.

ctype_digit() sufre el mismo problema.

Si también necesita incluir el uso de expresiones regulares cero este lugar: /^(?:0|[1-9][0-9]*)$/

+1

No hay nada particularmente dañino al aceptar 0123. Depende en cierto modo de lo que espera en general, de lo que intenta hacer con él ... pero por ejemplo,lo evaluará como 123 en cálculos, etc. ... –

+6

Un "número natural" es cada número ordinario de 1 hacia arriba (ℕ). Es por eso que creo que "0123" no es válido. – Koraktor

+0

cierto, pero como OP señaló, estaba confundido acerca de las definiciones. Entonces, de nuevo, se reduce a lo que él realmente quiere usar para ... –

Cuestiones relacionadas