Быстрый способ сопоставить массив слов с блоком текста? - PullRequest
2 голосов
/ 16 сентября 2009

Вопрос, возможно, не так ясен, как мог бы быть, но я изо всех сил пытался придумать лучший способ легко описать его.

Я внедряю фильтр плохого слова в некоторые статьи, которые мы выбираем из XML-канала. На данный момент у меня есть плохие слова в массиве, и я просто проверяю текст следующим образом:

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

Но это МЕДЛЕННО! Так медленно! И когда я пытаюсь обрабатывать более 30 000 статей одновременно, я начинаю задумываться, есть ли лучший способ добиться этого. Если бы только strpos поддерживал массивы! Даже тогда я не думаю, что это будет быстрее ...

Буду рад любым предложениям. Заранее спасибо!

EDIT:

Теперь я проверил несколько методов между вызовами microtime (), чтобы рассчитать их время. str_replace () = 990 секунд preg_match () = 1029 секунд (помните, мне нужно только идентифицировать их, а не заменить их) без фильтрации плохих слов = 1057 секунд (предположительно, потому что для обработки еще тысячи или около того статей с плохими формулировками.

Спасибо за все ответы, я просто по-прежнему с str_replace. :)

Ответы [ 4 ]

2 голосов
/ 16 сентября 2009

Раньше я работал в местном офисе газеты. вместо того, чтобы модифицировать текст для удаления плохих слов из исходных файлов, я просто запустил фильтр, когда пользователь запросил просмотр статьи. Таким образом, вы сохраняете оригинальный текст, если он вам когда-нибудь понадобится, а также раздаете чистую версию для своих зрителей. не должно быть необходимости обрабатывать 30 000 статей одновременно, если я что-то не так понимаю.

2 голосов
/ 16 сентября 2009

Как насчет объединения всех слов в регулярном выражении, чтобы заменить все за один раз? Я не уверен, как это пойдет на производительность, но может быть быстрее.

* 1005 Е.Г. *

preg_replace('/(' . implode('|', $badwords) . ')/i', '', $text);
1 голос
/ 16 сентября 2009

Определить «медленно»? Все, что будет обрабатывать 30 000 статей, вероятно, займет некоторое время.

Тем не менее, один из вариантов (который я не оценил, просто выбросил его для рассмотрения) - объединить слова в регулярное выражение и выполнить его через preg_replace (просто используя оператор | для их объединения). .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...