определить, содержит ли строка один из набора слов в массиве

Мне нужен простой фильтр слов, который убьет скрипт, если он обнаружит отфильтрованное слово в строке.

скажите, что мои слова ниже

$showstopper = array(badword1, badword2, badword3, badword4); $yourmouth = "im gonna badword3 you up"; if(something($yourmouth, $showstopper)){ //stop the show } 

Solutions Collecting From Web of "определить, содержит ли строка один из набора слов в массиве"

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

Из комментариев:

 $re = "/(" . implode("|", $showstopper) . ")/"; // '/(badword1|badword2)/' if (preg_match($re, $yourmouth) > 0) { die("foulmouth"); } 

in_array () – твой друг

  $yourmouth_array = explode(' ',$yourmouth); foreach($yourmouth_array as $key=>$w){ if (in_array($w,$showstopper){ // stop the show, like, replace that element with '***' $yourmouth_array[$key]= '***'; } } $yourmouth = implode(' ',$yourmouth_array); 

Возможно, вы захотите сравнить это с подходами foreach и preg_match .

 $showstopper = array('badword1', 'badword2', 'badword3', 'badword4'); $yourmouth = "im gonna badword3 you up"; $check = str_replace($showstopper, '****', $yourmouth, $count); if($count > 0) { //stop the show } 

Быстрое решение включает проверку ключа, так как это не требует итерации по массиву. Однако это потребует изменения вашего списка плохих слов.

 $showstopper = array('badword1' => 1, 'badword2' => 1, 'badword3' => 1, 'badword4' => 1); $yourmouth = "im gonna badword3 you up"; // split words on space $words = explode(' ', $yourmouth); foreach($words as $word) { // filter extraneous characters out of the word $word = preg_replace('/[^A-Za-z0-9]*/', '', $word); // check for bad word match if (isset($showstopper[$word])) { die('game over'); } } 

Preg_replace гарантирует, что пользователи не будут злоупотреблять вашим фильтром, введя что-то вроде bad_word3 . Он также гарантирует, что проверка ключа массива не бомбит.

не знаете, зачем вам это нужно, но есть способ проверить и получить плохие слова, которые были использованы

 $showstopper = array(badword1, badword2, badword3, badword4); $yourmouth = "im gonna badword3 you up badword1"; function badWordCheck( $var ) { global $yourmouth; if (strpos($yourmouth, $var)) { return true; } } print_r(array_filter($showstopper, 'badWordCheck')); 

array_filter () возвращает массив плохих слов, поэтому, если счетчик () его равен 0, неправильно сказано