2009-09-16 7 views
2

Le sujet n'est probablement pas aussi clair qu'il pourrait l'être, mais j'avais du mal à trouver une meilleure façon de le décrire facilement.Un moyen rapide de faire correspondre un tableau de mots avec un bloc de texte?

Je suis en train d'implémenter un filtre de badword sur certains articles que nous récupérons d'un flux XML. En ce moment j'ai les badwords dans un tableau et vérifie simplement le texte comme si;

str_replace($badwords, '', $text, $count); 
if ($count > 0) // We have bad words... 

Mais c'est SLOW! Tellement lent! Et quand j'essaie de traiter plus de 30 000 articles à la fois, je commence à me demander s'il existe une meilleure façon d'y parvenir. Si seulement des strpos pris en charge des tableaux! Même alors, je ne pense pas que ce serait plus rapide ...

Je voudrais des suggestions. Merci d'avance!

EDIT:

J'ai maintenant testé quelques méthodes entre les appels à microtime() pour les temps. str_replace() = 990 secondes preg_match() = 1029 secondes (Rappelez-vous que je n'ai besoin de les identifier que pour les remplacer) pas de mauvais filtrage de mots = 1057 secondes (vraisemblablement parce qu'il a encore un millier d'articles à traiter .

Merci pour toutes les réponses, je me contenterai toujours avec str_replace. :)

+3

Si vous traitez des articles vous pourriez 30,000+ vouloir envisager quelque chose autre que PHP qui a été construit pour une tâche comme celle-ci. sed http://www.grymoire.com/Unix/Sed.html (à condition qu'il soit disponible sur votre plate-forme) Disclaimer: aucune idée si c'est plus rapide – rojoca

+0

Sed est probablement plus rapide. –

+0

Ouais sed est une excellente idée en fait, pourrait traiter le xml avant de l'importer. Regardera cela comme une solution. – Christian

Répondre

2

que diriez-vous combiner tous les mots dans un regex pour remplacer tout en une seule fois? Je ne suis pas sûr de savoir comment cela va aller pour la performance, mais pourrait être être plus rapide.

E.g.

preg_replace('/(' . implode('|', $badwords) . ')/i', '', $text); 
+0

Cela pourrait bien fonctionner, merci Michael va essayer. – Christian

1

Définir "lent"? Tout ce qui va traiter 30 000 articles va probablement prendre un peu de temps à compléter. Cela dit, une option (que je n'ai pas benchmarked, juste jeter là pour considération) serait de combiner les mots dans une regex et exécutez cela à travers preg_replace (en utilisant simplement l'opérateur | pour les mettre ensemble).

+0

Tout comme Michael l'a dit. J'ai exécuté ce même script hier avant d'implémenter le filtre des mots interdits et même si je ne l'ai pas fait, c'était beaucoup plus rapide. Je comparerai encore le script sans filtre, les badwords str_replace et les badwords preg_replace et verrons à quel point cela fait la différence. – Christian

+0

Eh bien, je ne faisais pas vraiment référence au reste du script (même si c'est un autre facteur potentiel, même si cela ne semble pas être le problème dans votre cas). La plupart du temps, vous faites des opérations en texte intégral avec de nombreuses chaînes de correspondance potentielles. Je ne suis pas vraiment sûr que les compilateurs regex le fassent ou non, mais trouver un moyen de condenser l'expression rationnelle en une sorte de forme arborescente (par exemple '(a (b | c) | d (e | f))' au lieu de '(ab | ac | de | df)') pourrait aider l'analyse de regex plus rapidement (puisqu'elle pourrait annuler le match plus tôt), mais il est tout à fait possible que les compilateurs regex s'en occupent déjà pour vous. – Amber

+0

Oui, je ne suis pas sûr que la forme de l'arbre est possible d'être honnête. Bonne idée cependant. – Christian

2

Je travaillais au bureau de mon journal local. au lieu de modifier le texte pour supprimer les badwords des fichiers d'origine, ce que j'ai fait était juste lancer un filtre quand un utilisateur a demandé à voir l'article. De cette façon, vous conserverez le texte original si jamais vous en avez besoin, mais aussi une version propre pour vos spectateurs. il ne devrait pas être nécessaire de traiter 30 000 articles à la fois, à moins que je ne comprenne quelque chose.

+0

Ceci a l'inconvénient de ralentir le chargement de la page pour l'utilisateur ET d'ajouter une charge côté serveur les doublons fonctionnent pour chaque chargement de page. D'un autre côté, en fonction des modèles de trafic, cela pourrait être une victoire nette. –

+0

Nous recevons des fichiers xml d'articles par jour, de sorte qu'ils sont traités pendant la nuit lorsqu'il n'y a pas d'autre utilisation du serveur. Les articles sont déjà en cours de traitement et nous aurons toujours les copies xml si nous en avons besoin. Nous ne pouvons malheureusement pas nous permettre de faire fonctionner le filtre. :( – Christian

Questions connexes