La façon d'expression régulière serait certainement mon choix.
J'ai fait un petit test sur une chaîne de 320 mots avec la fonction de Veynom et une expression régulière
function preg($txt) {
return !preg_match('/\b(\w+)\b.*?\1/', $txt);
}
est ici le test
$time['preg'] = microtime(true);
for($i = 0; $i < 1000; $i++) {
preg($txt);
}
$time['preg'] = microtime(true) - $time['preg'];
$time['veynom-thewickedflea'] = microtime(true);
for($i = 0; $i < 1000; $i++) {
single_use_of_words($txt);
}
$time['veynom-thewickedflea'] = microtime(true) - $time['veynom-thewickedflea'];
print_r($time);
Et voici le résultat que je suis
Array
(
[preg] => 0.197616815567
[veynom-thewickedflea] => 0.487532138824
)
Ce qui suggère que la solution RegExp, tout en étant beaucoup plus concis, est plus de deux fois plus vite. (Pour une chaîne de 320 mots 1000 itérations) anr
Quand je lance le test de plus de 10 000 itérations je reçois
Array
(
[preg] => 1.51235699654
[veynom-thewickedflea] => 4.99487900734
)
La solution non RegExp utilise aussi beaucoup plus de mémoire.
So .. expressions régulières pour moi cos ils ont un réservoir plein de gaz
EDIT
Le texte que je teste contre a des mots en double, Dans le cas contraire, les résultats peuvent être différents . Je posterai un autre ensemble de résultats.
Mise à jour
Avec les doublons dépouillé (maintenant 186 mots) les résultats pour 1000 itérations est:
Array
(
[preg] => 0.235826015472
[veynom-thewickedflea] => 0.2528860569
)
A propos Evens
Remarque; J'ai corrigé mon code et l'ai testé. J'ai eu une petite faute de frappe – nlaq
Pourriez-vous poster votre script de ma réponse que vous avez dit n'a pas fonctionné? Je l'ai testé et ça fonctionne bien. En outre, si vous voulez insensible à la casse, utilisez "! Strcasecmp ($ words [$ i], $ words [$ p])" insead du "==" – nlaq
"Hello" et "Hello?" un ou deux mots? Au fond, quels délimiteurs attendez-vous? – jmucchiello