Quiero comprobar si una variable tiene un número en él, sólo quiero ver si es que la hay, no me importa si tiene cualquier otra cosa en él:

"abc" - false
"!./#()" - false
"!./#()abc" - false
"123" - true
"abc123" - true
"!./#()123" - true
"abc !./#() 123" -true

Hay maneras fáciles de hacer esto si usted quiere saber que es todos los números, pero no si sólo tiene uno. Gracias por tu ayuda.

InformationsquelleAutor Scott | 2009-05-23

5 Comentarios

  1. 69

    Puede utilizar el strcspn función:

    if (strcspn($_REQUEST['q'], '0123456789') != strlen($_REQUEST['q']))
      echo "true";
    else
      echo "false";

    strcspn devuelve la longitud de la parte que no contiene ninguno de los números enteros. Nos comparamos con la longitud de la cadena, y si son distintos, entonces no debe haber sido un entero.

    No hay necesidad de invocar el motor de expresiones regulares para esto.

    • Me comparan con los del este, se trata de un 80 por ciento más rápido que las expresiones regulares.
    • Bien … yo ni siquiera punto de referencia, me di cuenta de que no debe ser relativamente simple función de cadena que podría utilizar en lugar de sacar el martillo grande (regex)…
    • Que la función es nuevo para mí, una lástima que haya tan horrible nombre (¿qué representan?) es así que cerca del lugar se oponen: strspn. OMI este código es más difícil de entender que el regex, lo que lleva a algunos a hacer 😉
    • Gracias por la información, yo he usado las funciones antes, pero no de esta manera. Me gusta todo lo que se ejecuta más rápido!
    • Creo que el nombre de strcspn es una abreviatura de «cadena de complementar span» o algo así, y lo que realmente quiere decir es «la longitud de la cadena de complementar span» 🙂
    • Gracias! esto funcionó para mí después de que me quitaron la variable REQUEST
    • Gracias @MartinGeisler realmente me encontrado esta función para ser útil. Sin embargo, pensé que otra función actúa de manera similar. (strpbrk($var, '0123456789') por ejemplo, se han vinculado los casos de prueba a continuación.
    • esta es una forma muy elegante y rápida solución. gracias!!

  2. 12
    $result = preg_match("/\d/", $yourString) > 0;
    • Gracias, lo he probado antes pero no funciona por alguna razón.
    • Usted podría querer escapar de la barra diagonal inversa correctamente — aquí se basa en el hecho de que \d no es una secuencia de escape, y por lo tanto, será tratada como si hubiera escrito \\d.
    • Tienes razón acerca de las secuencias de escape (yo no era de confiar en algo, sin embargo, yo simplemente olvidó). Corregido, gracias por la sugerencia.
    • +1 porque es más fácil de leer que la versión strcspn
    • Irónicamente, esto incluso ha sido votado. Aunque yo esperaría que la ventaja de la velocidad de strcspn() no ser relevante en el 99% de los casos de uso.
  3. 8

    Mantiene en el espíritu de @Martin, he encontrado otra función que funciona de manera similar.

    (strpbrk($var, '0123456789')

    por ejemplo, del caso de prueba

    <?php
    
    function a($var) {
        return (strcspn($var, '0123456789') != strlen($var));
    }
    
    function b($var) {
        return (strpbrk($var, '0123456789'));
    }
    
    $var = array("abc", "!./#()", "!./#()abc", "123", "abc123", "!./#()123", "abc !./#() 123");
    
    foreach ($var as $v) {
        echo $v . ' = ' . b($v) .'<hr />';
    }
    
    ?>
    • debe de ser la más rápida solución
  4. 4

    Esto debería ayudarle a:

    $numberOfNumbersFound = preg_match("/[0-9]+/", $yourString);

    Usted podría obtener más de la función preg_match, así que eche un vistazo a su manual

    • Perfecto, entonces todo lo que usted necesita hacer es comprobar if( $numberOfNumbersFound > 0 ) Gracias!
  5. -2

    puede utilizar este patrón para probar su cadena de utilización de expresiones regulares:

    $isNumeric = preg_match("/\S*\d+\S*/", $string) ? true : false;
    • oops! tomó un minuto para corregir el patrón, y BAWNG! obtuvo un voto. son rápidos chicos! ;P
    • no funcionará si «asdf 123asdf» y ¿por qué no usar simplemente ([0-9]+)
    • supongo que la forma más rápida downvote fue de mí, pero no para el regex, pero para el ? true : false; (==0 haría lo mismo, si usted insiste en $isNumeric ser un valor booleano, sin embargo en PHP que podría haber asignar preg_match resultado a $isNumeric y, a continuación, la banda de rodamiento $isNumeric como un valor booleano, sinec nada <> 0 sería verdadero y 0 false. Detesto SI (boolean), a CONTINUACIÓN, TRUE ELSE FALSA especie de código
    • He probado y ha funcionado. He copiado la misma cadena que ofrece: «asdf 123asdf» y se devuelve «true». que de acuerdo a sexto ejemplo de la pregunta, debe tener devuelve true. en regex hay muchas maneras de definir un patrón, estoy seguro de que [0-9]+ es correcto, una sola \d es correcto. el patrón que he recomendado aquí es correcto. Yo tenía mi voto porque en el momento de la publicación de mi respuesta, me perdí asteriscos en el patrón (me lo imaginaba). y como él mismo dice, porque MasterPeter no como el operador ternario he utilizado.

Dejar respuesta

Please enter your comment!
Please enter your name here