validar preg_match only numero entero php validation preg-match isnumeric

preg_match - php validar numero entero



ValidaciĆ³n de PHP is_numeric o preg_match 0-9 (11)

Este no es un gran problema para mí (hasta donde yo sé), es más de algo que me interesa. Pero, ¿cuál es la principal diferencia, si la hay, de usar is_numeric sobre preg_match (o viceversa) para validar los valores de entrada del usuario?

Ejemplo uno:

<?php $id = $_GET[''id'']; if (!preg_match(''/^[0-9]*$/'', $id)) { // Error } else { // Continue } ?>

Ejemplo dos:

<?php $id = $_GET[''id'']; if (!is_numeric($id)) { // Error } else { // Continue } ?>

Supongo que ambos hacen exactamente lo mismo, pero ¿hay alguna diferencia específica que podría causar problemas más tarde de alguna manera? ¿Hay una "mejor manera" o algo que no veo que los haga diferentes?


La función is_numeric de PHP permite flotantes y enteros. Al mismo tiempo, la función is_int es demasiado estricta si desea validar los datos del formulario (solo cadenas). Por lo tanto, generalmente es mejor usar expresiones regulares para esto.

Estrictamente hablando, los enteros son números enteros positivos y negativos, y también incluyen cero. Aquí hay una expresión regular para esto:

/ ^ 0 $ | ^ [-]? [1-9] [0-9] * $ /

O, si desea permitir ceros a la izquierda:

/ ^ [-]? [0] | [1-9] [0-9] $ /

Tenga en cuenta que esto permitirá valores como -0000, que no causa problemas en PHP, sin embargo. (MySQL también arrojará valores como 0.)

También puede limitar la longitud de su número entero para consideraciones de las características de la plataforma PHP de 32/64 bits y / o la compatibilidad de la base de datos. Por ejemplo, para limitar la longitud de su número entero a 9 dígitos (excluyendo el signo opcional), puede usar:

/ ^ 0 $ | ^ [-]? [1-9] [0-9] {0,8} $ /


Mientras tanto, todos los valores anteriores solo restringirán los valores a enteros, entonces uso

/^[1-9][0-9/.]{0,15}$/

para permitir valores de flotación también.


No es exactamente lo mismo.

De los documentos de PHP de is_numeric:

''42'' is numeric ''1337'' is numeric ''1e4'' is numeric ''not numeric'' is NOT numeric ''Array'' is NOT numeric ''9.1'' is numeric

Con su expresión regular solo verifica valores numéricos ''básicos''.

También is_numeric() debería ser más rápido.


Puede usar este código para la validación de números:

if (!preg_match("/^[0-9]+$/i", $phone)) { $errorMSG = ''Invalid Number!''; $error = 1; }


Según http://www.php.net/manual/en/function.is-numeric.php , is_numeric tiene algo así como "+ 0123.45e6" o "0xFF". Creo que esto no es lo que esperas.

preg_match puede ser lento, y puede tener algo como 0000 o 0051.

Prefiero usar ctype_digit (funciona solo con cadenas, está bien con $ _GET).

<?php $id = $_GET[''id'']; if (ctype_digit($id)) { echo ''ok''; } else { echo ''nok''; } ?>


Si solo está comprobando si se trata de un número, is_numeric() es mucho mejor aquí. Es más legible y un poco más rápido que regex.

El problema con su expresión regular aquí es que no permitirá los valores decimales, por lo que esencialmente acaba de escribir is_int() en is_int() regulares. Las expresiones regulares solo deben usarse cuando hay un formato de datos no estándar en su entrada; PHP tiene muchas funciones de validación integradas, incluso un validador de correo electrónico sin expresiones regulares .


is_numeric () permite cualquier forma de número. entonces 1 , 3.14159265 , 2.71828e10 son todos "numéricos", mientras que su expresión regular se reduce al equivalente de is_int()


is_numeric aceptaría "-0.5e + 12" como una identificación válida.


is_numeric comprueba si se trata de cualquier tipo de número, mientras que su expresión regular comprueba si se trata de un número entero, posiblemente con 0 iniciales. Para una identificación, almacenada como un entero, es bastante probable que no tengamos los 0 principales. Siguiendo la respuesta de Spudley, podemos hacer:

/^[1-9][0-9]*$/

Sin embargo, como señala Spudley, la cadena resultante puede ser demasiado grande para almacenarse como un valor entero de 32 o 64 bits. El valor máximo de un entero de 32 bits con signo es 2.147.483.647 (10 dígitos), y el valor máximo de un entero de 64 bits con signo es de 9,223,372,036,854,775,807 (19 dígitos). Sin embargo, muchos enteros de 10 y 19 dígitos son más grandes que los enteros máximos de 32 bits y 64 bits, respectivamente. Una solución simple solo con expresiones regulares sería:

/^[1-9][0-9]{0-8}$/

o

/^[1-9][0-9]{0-17}$/

respectivamente, pero estas "soluciones" restringen infelizmente cada uno a números enteros de 9 y 19 dígitos; difícilmente un resultado satisfactorio. Una mejor solución podría ser algo como:

$expr = ''/^[1-9][0-9]*$/''; if (preg_match($expr, $id) && filter_var($id, FILTER_VALIDATE_INT)) { echo ''ok''; } else { echo ''nok''; }


is_numeric() prueba si un valor es un número. Sin embargo, no necesariamente tiene que ser un número entero: podría ser un número decimal o un número en notación científica.

El ejemplo de preg_match() que ha dado solo comprueba que un valor contiene los dígitos de cero a nueve; cualquier número de ellos, y en cualquier secuencia.

Tenga en cuenta que la expresión regular que ha dado también no es un comprobador de enteros perfecto, de la forma en que lo ha escrito. No permite negativos sí permite una cadena de longitud cero (es decir, sin ningún dígito, que presumiblemente no debería ser válida?), y permite que el número tenga cualquier número de ceros a la izquierda, lo que de nuevo puede no ser el deseado.

[EDITAR]

Según su comentario, una mejor expresión regular podría verse así:

/^[1-9][0-9]*$/

Esto obliga al primer dígito a estar solo entre 1 y 9, por lo que no puede tener ceros a la izquierda. También lo obliga a tener al menos un dígito de longitud, por lo que resuelve el problema de cadena de longitud cero.

No te preocupan los aspectos negativos, así que eso no es un problema.

Es posible que desee restringir el número de dígitos, porque tal como están las cosas, permitirá que las cadenas que son demasiado grandes se almacenen como enteros. Para restringir esto, cambiaría la estrella en una restricción de longitud como esta:

/^[1-9][0-9]{0,15}$/

Esto permitiría que la cadena tenga entre 1 y 16 dígitos de longitud (es decir, el primer dígito más 0-15 dígitos adicionales). Siéntase libre de ajustar los números en las llaves para satisfacer sus propias necesidades. Si desea una cadena de longitud fija, solo necesita especificar un número entre las llaves.

Espero que ayude.


is_numeric comprueba más:

Encuentra si la variable dada es numérica. Las cadenas numéricas constan de signo opcional, cualquier cantidad de dígitos, parte decimal opcional y parte exponencial opcional. Por lo tanto + 0123.45e6 es un valor numérico válido. La notación hexadecimal (0xFF) también está permitida, pero solo sin signo, decimal y parte exponencial.