【问题标题】:PHP: Simple, Validate if string is hex?PHP:简单,验证字符串是否为十六进制?
【发布时间】:2011-02-08 05:55:09
【问题描述】:

我不知道如何验证这个字符串。我只是提供一个 IV 进行加密,但找不到 1is_hex()1 或类似函数,我无法理解它!我阅读了 php 文档(用户贡献注释)中的评论:

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

但这似乎根本不起作用..它只说假。 如果它有助于我对 IV 的输入是这样的:

92bff433cc639a6d

【问题讨论】:

    标签: php encryption binary hex


    【解决方案1】:

    有什么理由不匹配像“[0-9A-Fa-f]+”这样的简单 RE 吗? (编辑:可能在开头带有 '^' 并在结尾处带有 '$' 以确保您匹配整个字符串)。

    【讨论】:

    • 我试过了,$iv = "92bff433cc63da6W" if(preg_match('/[0-9A-Fa-f]+/', $iv)) { $enc = mcrypt_encrypt( MCRYPT_BLOWFISH, $key , $data, MCRYPT_MODE_CBC, pack("H*",$iv)); $ENCRSLT = bin2hex($enc); } else { $ENCRSLT = "错误:键或 IV 不是十六进制。有效字符:0-9a-f。";但它没有验证(最后明显的 W)
    • 按照 Jerry 的建议使用正则表达式:“^[0-9a-f]$”。并根据您粘贴的错误消息删除大写 A-F,因为它不受支持。
    • 好的,它工作得很好。我实际上打算自己尝试一下,我想我自己的正则表达式还不错。谢谢
    • 找到单独的非范围字符比检查整个字符串更好。
    【解决方案2】:

    使用函数: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 由所有十六进制数字组成。

    【讨论】:

    • 谢谢!我只是有时不喜欢使用正则表达式,我很高兴那里有一些准系统。下次一定要多看函数列表。
    【解决方案3】:

    您的输入太大。来自dexhex的PHP手册

    十进制可以转换的最大数是4294967295 导致“ffffffff”

    因此,您最好使用其他人已经在此处提供的 RegEx。

    【讨论】:

    • 十六进制是 IV 的 8 字节字符串,而不是数字,正则表达式和更好的 ctype_xdigit 完成了这项工作。
    【解决方案4】:

    这也是可能的,非常简单

    $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';
    

    【讨论】:

    【解决方案5】:

    检查 HEX 字符串的完美方法适用于 PHP 4 及更高版本。

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        没有ctyperegex的另一种方式:

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

        【讨论】:

          猜你喜欢
          • 2012-07-10
          • 2023-01-18
          • 2020-11-07
          • 2012-07-20
          • 1970-01-01
          • 1970-01-01
          • 2018-01-31
          • 2019-07-27
          相关资源
          最近更新 更多