Мне нужен простой фильтр слов, который убьет скрипт, если он обнаружит отфильтрованное слово в строке.
скажите, что мои слова ниже
$showstopper = array(badword1, badword2, badword3, badword4); $yourmouth = "im gonna badword3 you up"; if(something($yourmouth, $showstopper)){ //stop the show }
Вы можете взорвать массив значков в регулярное выражение и посмотреть, совпадает ли он с сторой сена. Или вы можете просто перебирать массив и проверять каждое слово отдельно.
Из комментариев:
$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, неправильно сказано