web-dev-qa-db-ja.com

PHP:シンプル、文字列が16進数かどうかを検証しますか?

この文字列を検証する方法がわかりません。暗号化用のIVを提供しているだけですが、1is_hex()1または同様の関数が見つからないため、頭を包むことができません。私はphpドキュメント(ユーザー投稿メモ)のコメントを読んだ:これ:

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

しかし、それはまったく機能していないようです。それが私のIVの入力に役立つ場合は、次のようになります。

92bff433cc639a6d
28
oni-kun

関数を使用する: 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はすべて16進数で構成されます。
  • 文字列AR1012はすべて16進数で構成されているわけではありません。
  • 文字列ab12bc99はすべて16進数で構成されます。
54
Haim Evgi

「[0-9A-Fa-f] +」のような単純なREと一致しない理由はありますか? (編集:文字列全体が一致していることを確認するために、最初に「^」、最後に「$」を付けることができます)。

3
Jerry Coffin

ctypeまたはregexを使用しない別の方法:

$str = 'string to check';

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

大文字と小文字を区別しない「i」フラグを追加します

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

HEX文字列をチェックする完璧な方法は、PHP 4以降で機能します。

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

入力が大きすぎます。 PHPマニュアル dexhex

変換できる最大数は10進数で4294967295であり、「ffffffff」になります。

したがって、他の人からすでにここで提供されているRegExを使用したほうがよいでしょう。

1
nikc.org

これも可能で、非常に簡単です

$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
paul.pech