2010-04-15 227 views
24

我不知道如何验证这个字符串。我只是提供一个IV加密,但可以找到没有1is_hex()1或类似的功能,我无法用头围住它!我读的PHP文件中评论这个(用户的contrib说明。):PHP:简单,验证如果字符串是十六进制?

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

但是,这似乎并没有在所有的工作。它只是说假的。 如果它帮助我我的IV的投入将是这样的:

92bff433cc639a6d 

回答

49

使用功能: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"; 
    } 
} 
?> 

上例将输出:

  • 字符串AB10BC99由所有十六进制数字。
  • 字符串AR1012不包含所有十六进制数字。
  • 字符串ab12bc99由所有十六进制数字组成。
+1

谢谢!有时我只是不喜欢使用正则表达式,我很高兴那里有一些准系统。下次在函数列表中必须多看一些。 – 2010-04-15 06:39:53

3

有什么理由不来匹配一个简单的重像“[0-9A发-F] +”? (编辑:在开始时可能带有'^',末尾带有'$'以确保您匹配了整个字符串)。

+0

我试过, $ IV = “92bff433cc63da6W” 如果( preg_match('/ [0-9A-Fa-f] + /',$ iv)){$ enc = mcrypt_encrypt(MCRYPT_BLOWFISH,$ key,$ data,MCRYPT_MODE_CBC,包( “H *”,$ IV)); $ ENCRSLT = bin2hex($ enc); } else { $ ENCRSLT =“错误:密钥或IV不是十六进制,有效字符:0-9a-f。”; } 但它不验证(最后显而易见的W) – 2010-04-15 06:29:52

+0

糟糕,注释不会格式化,对不起。大声笑 – 2010-04-15 06:30:14

+0

去正则表达式:“^ [0-9a-f] $”由杰里建议。根据您粘贴的错误信息,不支持大写的A-F。 – 2010-04-15 06:32:49

1

您的输入太大。从dexhex

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

PHP手册所以你会更好使用正则表达式,它已经被其他人提供在这里。

+0

十六进制是一个8字节的字符串,而不是一个数字,正则表达式和更好的ctype_xdigit做的工作。 – 2010-04-15 06:42:08

0

这也是可能的,很简单

$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

而且相当昂贵。 – caiosm1005 2014-05-01 21:29:45

+0

在PHP 7中不再允许,请参阅“十六进制字符串不再被视为数字”http://php.net/manual/en/migration70.incompatible.php – 2016-09-20 21:52:26

1

检查十六进制字符串最完美的方式从PHP 4及以上的作品。

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

添加不区分大小写的 'i' 标志

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

的另一种方式,而不ctyperegex

$str = 'string to check'; 

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