Zitat:
Zitat von Slava
@fireweasel
base64_decode liefert erst dann false, wenn die zeichen nicht zu base64 alphabet passen. das ist aber nicht ausreichend um zu sagen , dass ein String base64 codiert ist. ...
|
Ja, ich hab mich einfach aufs PHP-Handbuch verlassen, bzw. es so interpretiert, dass base64_decode() wirklich FALSE liefert, falls der übergebene String unpassende Zeichen enthält. Anscheinend kann man aber der Funktion alles Mögliche übergeben, ohne dass sie jemals mit FALSE antwortet (was auch ein Blick in den Quältext zeigt). Das ist kein Wunder, wenn man bedenkt, dass base64_decode() auch Zeilenumbrüche und ähnlichen Kleinkram beim Dekodieren ignorieren soll. Zur "Syntax"-
Prüfung ist sie also ungeeignet.
Daher jetzt die von mir ursprünglich angedachte Variante:
PHP-Code:
// checks if $string is base64-encoded
// returns TRUE|FALSE
function is_base64(
$string = NULL
) {
if (!is_string($string) || !isset($string[3])) {
return FALSE;
}
return (bool) preg_match(
'/\A
(?:\s*([a-zA-Z0-9\/+]{4})+)* # multiple lines
\s*
(?:[a-zA-Z0-9\/+]{4})* # single|last line
(?:[a-zA-Z0-9\/+]{3}=|[a-zA-Z0-9\/+]{2}==)? # single|last line trailing bytes
\s*
\z/sx',
$string
);
}
Den regulären Ausdruck kann man noch vereinfachen, indem man Subroutinen benutzt.
Aus Faulheit überlasse ich dies dem Betrachter als Übungsaufgabe. ;-)
Zitat:
Zitat von Slava
100% geht das nicht, aber so wäre es möglich zu testen:
PHP-Code:
$str = 'RGllcyBpc3QgZWluIHp1IGtvZGllcmVuZGVyIFN0cmluZw==';
if($str===base64_encode(@base64_decode($str)))
{
echo 'Ja! Das ist warscheinlich base64 string';
}
Es besteht immer noch eine Wahrscheinlichkeit, das es sich nicht um base64 handelt. (vieleich ist das einfach mein passwort, oder andere Buchstabenkombination, die ich eben erfunden habe ?)
|
Who cares?
Es sieht aus wie base64, läuft wie base64, quakt wie base64 -- also ist es base64.
Schließlich hat niemand verlangt, dass nach dem Dekodieren was Brauchbares herauskommen soll. ;-)