Эффективный способ проверки строки для определенных слов

У меня есть куча запрещенных слов и вы хотите проверить, содержит ли строка A любое из этих слов.

Например:

$banned_words = "dog cat horse bird mouse monkey blah blah2 blah3 "; //etc $string_A = "The quick brown fox jumped over the lazy dog"; 

Как я могу эффективно проверить, соответствует ли какое-либо из слов в строке любому из слов в списке запрещенных слов?

Related of "Эффективный способ проверки строки для определенных слов"

 if (preg_match('~\b(' . str_replace(' ', '|', $banned_words) . ')\b~', $string_A)) { // there is banned word in a string } 

Разве не лучше, если $banned_w будет массивом?

Затем вы можете explode() строку, которую вы хотите проверить для запрещенных слов, а затем для каждой взорванной части используйте in_array() чтобы проверить, запрещено ли это слово.

Изменить: вы можете использовать: Similar_text для сравнения, если немного изменить плохое слово.

Было бы намного проще создать массив запрещенных слов, а затем использовать str_replace с этим массивом, например:

 $banned_words = array('dog', 'cat', 'horse', 'bird', 'mouse', 'monkey', 'blah', 'blah2', 'blah3'); $string_A = "The quick brown fox jumped over the lazy dog"; echo str_replace($banned_words, "***", $string_A); 

Выйдет: The quick brown fox jumped over the lazy ***

Я только что разработал функцию, которая может отфильтровывать плохие слова:

 function hate_bad($str) { $bad=array("shit","ass"); $piece=explode(" ",$str); for($i=0;$i < sizeof($bad); $i++) { for($j=0;$j<sizeof($piece);$j++) { if($bad[$i]==$piece[$j]) { $piece[$j]=" ***** "; } } } return $piece; } 

и назовите его так:

 $str=$_REQUEST['bad'];// here bad is the name of tex field<br/><br/> $good=hate_bad($str); <br/> if(isset($_REQUEST['filter']))// 'filter' name of button { for($i=0;$i<sizeof($good);$i++) {<br/> echo $good[$i]; } } 

Вы можете использовать str_ireplace, чтобы проверить наличие плохих слов или фраз. Это можно сделать в одной строке кода PHP без необходимости вложенных циклов или регулярных выражений следующим образом:

 $banstring = ($string != str_ireplace($badwords,"XX",$string))? true: false; 

Такой подход имеет дополнительное преимущество – нечувствительность к регистру. Чтобы увидеть это в действии, вы можете выполнить проверку следующим образом:

 $string = "The quick brown fox jumped over the lazy dog"; $badwords = array('dog','cat','horse','bird','mouse','monkey'); $banstring = ($string != str_ireplace($badwords,"XX",$string))? true: false; if ($banstring) { echo 'Bad words found'; } else { echo 'No bad words in the string'; } 

Если список плохих слов – это строка, а не массив (как в вопросе), то строка может быть преобразована в массив следующим образом:

 $banned_words = "dog cat horse bird mouse monkey"; //etc $badwords = explode(" ", $banned_words);