2010-11-10 4 views

Répondre

11

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'); 
} 
+0

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

+0

@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

+0

mais apparemment la fonction d'ord de PHP a des problèmes avec utf-8 – barlop

3

Vérifiez si un octet est supérieur à 0x7f ou si un caractère est supérieur à U + 007F.

+1

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

+1

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 –

0
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); 
} 
+0

cela échouera sur certains valide Caractères de contrôle ASCII – stillstanding

+0

voir la fonction mise à jour. est-ce plus rapide/meilleur que l'itération? – philfreo

Questions connexes