2010-04-15 3 views
24

Ich habe keine Ahnung, wie diese Zeichenfolge validiert wird. Ich gebe einfach eine IV für eine Verschlüsselung, kann aber keine 1is_hex() 1 oder ähnliche Funktion finden, ich kann mich nicht darum kümmern! Ich las auf einen Kommentar in der PHP-Dokumentation dieses (Benutzer contrib Noten.):PHP: Simple, Validate, wenn die Zeichenfolge hex ist?

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

Aber das scheint nicht überhaupt zu arbeiten .. Es sagt nur falsch. Wenn es hilft meinem Eingang meiner IV sein würde:

92bff433cc639a6d 

Antwort

49

Verwenden Funktion: 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"; 
    } 
} 
?> 

Das obige Beispiel folgende Ausgabe:

  • Die Zeichenfolge AB10BC99 aller Hexadezimalziffern besteht.
  • Die Zeichenfolge AR1012 besteht nicht aus allen hexadezimalen Ziffern.
  • Die Zeichenfolge ab12bc99 besteht aus allen Hexadezimalziffern.
+1

Vielen Dank!Ich mag es manchmal nicht, Regex zu benutzen, ich bin froh, dass da etwas Barebone war. Muss beim nächsten Mal mehr in die Liste der Funktionen schauen. –

3

Gibt es einen Grund, nicht gegen eine einfache RE passen wie „[0-9A-Fa-f] +“? (edit: möglicherweise mit einem '^' am Anfang und '$' am Ende, um sicherzustellen, dass Sie die ganze Zeichenfolge gefunden haben).

+0

Ich versuchte, iv $ = "92bff433cc63da6W" if (preg_match ('/ [0-9A-Fa-f] + /', $ iv)) { $ enc = mcrypt_encrypt (MCRYPT_BLOWFISH, $ Schlüssel, $ Daten, MCRYPT_MODE_CBC, Packung ("H *", $ iv)); $ ENCRSLT = bin2hex ($ enc); } else { $ ENCRSLT = "Fehler: Schlüssel oder IV ist nicht Hexadezimal. Gültige Zeichen: 0-9a-f."; } Aber es validiert nicht (das offensichtliche W am Ende) –

+0

Hoppla, Kommentare würden nicht formatieren, sorry. lol –

+0

Gehen Sie für die Regexp: "^ [0-9a-f] $" wie von Jerry vorgeschlagen. Und lassen Sie das Großbuchstabe A-F fallen, da es gemäß der Fehlermeldung, die Sie eingefügt haben, nicht unterstützt wird. –

1

Ihre Eingabe ist zu groß. Von der PHP-Handbuch von dexhex

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

So werden Sie besser dran mit einem RegEx sein, die bereits geliefert wurden von anderen hier haben.

+0

Das Hex war eine 8-Byte-Zeichenfolge für die IV, anstatt eine Zahl, regex und besser ctype_xdigit hat die Aufgabe erledigt. –

0

Dies ist auch möglich und ganz einfach

$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

Und ziemlich teuer. – caiosm1005

+0

In PHP 7 nicht mehr erlaubt, siehe "Hexadezimale Zeichenfolgen werden nicht mehr als numerisch betrachtet" http://php.net/manual/en/migration70.incompatible.php –

1

Der perfekte Weg, HEX-String zu prüfen, arbeitet von PHP 4 und höher.

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

Fügen Sie die Groß- und Kleinschreibung 'i' flag

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

Ein anderer Weg, ohne ctype oder regex:

$str = 'string to check'; 

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