2010-04-15 2 views
24

이 문자열의 유효성을 검사하는 방법에 대한 단서가 없습니다. 나는 단순히 암호화를 위해 IV를 제공하고 있지만, 1is_hex() 1 또는 유사한 함수를 찾을 수는 없다. 나는 그 주위에 내 머리를 감쌀 수 없다! (. 사용자의 contrib 노트) 나는 PHP 문서에 코멘트에이 읽기 :PHP : 문자열이 16 진수 일 경우 단순, 유효성 검사를 하시겠습니까?

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 모두 16 진수로 구성 문자열입니다.
  • 문자열 AR1012은 모든 16 진수로 구성되지 않습니다.
  • 문자열 ab12bc99은 모든 16 진수로 구성됩니다.
+1

감사합니다!나는 정규식을 때때로 사용하는 것을 싫어한다, 나는 거기에 뭔가 뼈가있어 기뻤다. 다음에 기능 목록에서 더 많이보아야합니다. –

3

같은 간단한 RE에 대해 "[0-9A-FA-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가 16 진수가 아닙니다. 유효한 문자 : 0-9a-f."; } 그러나 유효하지 않습니다. (끝 부분의 명백한 W) –

+0

죄송합니다. 형식이 잘못되었습니다. 죄송합니다. lol –

+0

Jerry가 제안한 "^ [0-9a-f] $"정규 표현식으로 이동하십시오. 붙여 넣기 오류 메시지에 따라 지원되지 않는 대문자 A-F를 놓습니다. –

1

입력 내용이 너무 큽니다. dexhex

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

의 PHP 설명서에서 그래서 당신은 이미 다른 사람이 여기에 공급 된 정규식을 사용하여 더 나을 수 있습니다.

+0

16 진수는 숫자가 아닌 4 바이트의 8 바이트 문자열이었습니다. 정규 표현식과 ctype_xdigit이 더 좋았습니다. –

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

+0

PHP 7에서 더 이상 허용되지 않습니다. "16 진수 문자열은 더 이상 숫자로 간주되지 않습니다"http://php.net/manual/en/migration70.incompatible.php를 참조하십시오. –

1

16 진수 문자열을 확인하는 완벽한 방법은 위의 PHP 4에서 작동 매우 간단합니다.

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

또 다른 방법 ctype 또는 regex없이 대소 문자 구분 '난'플래그

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

을 추가

$str = 'string to check'; 

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