2010-04-15 17 views
24

No tengo ni idea de cómo validar esta cadena. Simplemente estoy suministrando un IV para un cifrado, pero no puedo encontrar 1is_hex() 1 o una función similar, ¡no puedo entenderlo! He leído en un comentario en la documentación de PHP esto (contrib usuario notas.):PHP: simple, validar si la cadena es hexadecimal

if($iv == dechex(hexdec($iv))) { 
    //True 
} else { 
    //False 
} 

Pero eso no parece funcionar en absoluto .. Sólo se dice falsa. si ayuda a mi entrada de mi IV sería la siguiente:

92bff433cc639a6d 

Respuesta

49

Uso función: ctype_xdigit

<?php 
$strings = array('AB10BC99', 'AR1012', 'ab12bc99'); 
foreach ($strings as $testcase) { 
    if (ctype_xdigit($testcase)) { 
     echo "The string $testcase consists of all hexadecimal digits.\n"; 
    } else { 
     echo "The string $testcase does not consist of all hexadecimal digits.\n"; 
    } 
} 
?> 

El resultado del ejemplo sería:

  • La cadena AB10BC99 consta de todos los dígitos hexadecimales.
  • La cadena AR1012 no consta de todos los dígitos hexadecimales.
  • La cadena ab12bc99 consta de todos los dígitos hexadecimales.
+1

¡Gracias!A veces no me gusta usar Regex, me alegro de que haya algo barebone allí. Debe buscar más en la lista de funciones la próxima vez. –

3

¿Hay alguna razón para no coincidir en contra de un simple RE como "[0-9A-Fa-f] +"? (editar: posiblemente con un '^' al principio y '$' al final para asegurarse de que ha coincidido con toda la cadena).

+0

he intentado, $ iv = "92bff433cc63da6W" si (preg_match ('/ [0-9A-Fa-f] + /', $ iv)) { $ enc = mcrypt_encrypt (MCRYPT_BLOWFISH, $ clave, $ datos, MCRYPT_MODE_CBC, paquete ("H *", $ iv)); $ ENCRSLT = bin2hex ($ enc); } else { $ ENCRSLT = "Error: la clave o IV no es Hexidecimal. Caracteres válidos: 0-9a-f."; } Pero no valida (la obvia W al final) –

+0

Vaya, los comentarios no se formatearán, lo siento. lol –

+0

Vaya para la expresión regular: "^ [0-9a-f] $" según lo sugerido por Jerry. Y suelte la mayúscula A-F ya que no es compatible de acuerdo con el mensaje de error que pegó. –

1

Su entrada es demasiado grande. Desde el manual de PHP de dexhex

The largest number that can be converted is 4294967295 in decimal resulting to "ffffffff"

por lo que será mejor usar una expresión regular, que ya han sido suministrados aquí por otros.

+0

El hexágono era una cadena de 8 bytes para IV en lugar de un número, expresiones regulares y mejor ctype_xdigit hizo el trabajo. –

0

Esto también es posible y bastante simple

$a="affe"; //is_hex 
$b="a0bg"; //is_not_hex 

if(is_numeric('0x'.$a)) echo 'is_hex'; 
else echo 'is_not_hex'; 

if(is_numeric('0x'.$b)) echo 'is_hex'; 
else echo 'is_not_hex'; 
+0

Y bastante caro. – caiosm1005

+0

Ya no se permite en PHP 7, consulte "Las cadenas hexadecimales ya no se consideran numéricas" http://php.net/manual/en/migration70.incompatible.php –

1

La forma perfecta para comprobar cadena HEX funciona desde PHP 4 o superior.

<?php 
function is_hex($hex_code) { 
     return @preg_match("/^[a-f0-9]{2,}$/i", $hex_code) && !(strlen($hex_code) & 1); 
} 
?> 
0

Añadir el caso insensible 'i' bandera

preg_match('/^[0-9a-f]+$/i', ... 
1

Otra forma sin ctype o regex:

$str = 'string to check'; 

if (trim($str, '0..9A..Fa..f') == '') { 
    // string is hexadecimal 
}