2010-04-15 50 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 
} 
相關問題