Quel est le moyen le plus rapide, en PHP, de déterminer si un texte UTF-8 donné est purement ASCII ou non?Déterminer si le texte UTF-8 est tout ASCII?
Répondre
Une fonction peut-être plus rapide serait d'utiliser une classe de caractère négatif (puisque l'expression régulière peut simplement arrêter quand il frappe le premier caractère, et il n'y a pas besoin de capturer en interne quoi que ce soit):
function isAscii($str) {
return 0 == preg_match('/[^\x00-\x7F]/', $str);
}
sans regex (basé sur mon commentaire) {
function isAscii($str) {
$len = strlen($str) {
for ($i = 0; $i < $len; $i++) {
if (ord($str[$i]) > 127) return false;
}
return true;
}
Mais je dois demander, pourquoi êtes-vous si préoccupé plus vite? Utilisez plus lisible et plus facile à comprendre la version, et ne vous inquiétez pas sur l'optimisation quand vous savez c'est un problème ...
Modifier:
le plus rapide sera probablement alors mb_check_encoding
:
function isAscii($str) {
return mb_check_encoding($str, 'ASCII');
}
Vérifiez si un octet est supérieur à 0x7f ou si un caractère est supérieur à U + 007F.
Assez simple '$ isNotAscii = false; pour ($ i = 0, $ len = strlen ($ chaîne); $ i <$ len; $ i ++) {if (ord ($ chaîne [$ i])> 127) {$ isNotAscii = true; Pause; }} '. Il itéra sur chaque caractère de la chaîne à la recherche d'un caractère> 127 ... – ircmaxell
Je crois que preg_match sera plus rapide dans ce cas ... n'a pas de benchmark mais pour les chaînes de correspondance, il est presque toujours –
function isAscii($str) {
return preg_match('/^([\x00-\x7F])*$/', $str);
}
// doesn't accept ASCII control characters
function isAsciiText($str) {
return preg_match('/^([\x09\x0A\x0D\x20-\x7E])*$/', $str);
}
cela échouera sur certains valide Caractères de contrôle ASCII – stillstanding
voir la fonction mise à jour. est-ce plus rapide/meilleur que l'itération? – philfreo
ceci sera exécuté sur beaucoup de texte fréquemment, et je pense que les deux sont très lisibles, tellement plus vite est certainement meilleur ici. – philfreo
@philfreo: Mise à jour une réponse ... Mais le meilleur moyen pour vous de dire ce qui est le plus rapide est de réellement comparer les options en utilisant vos conditions ... – ircmaxell
mais apparemment la fonction d'ord de PHP a des problèmes avec utf-8 – barlop