определить, содержит ли строка одно из набора слов в массиве - PullRequest
2 голосов
/ 16 декабря 2009

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

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

$showstopper = array(badword1, badword2, badword3, badword4);

$yourmouth = "im gonna badword3 you up";

if(something($yourmouth, $showstopper)){ 
//stop the show
}

Ответы [ 5 ]

6 голосов
/ 16 декабря 2009

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

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

$re = "/(" . implode("|", $showstopper) . ")/"; //  '/(badword1|badword2)/'
if (preg_match($re, $yourmouth) > 0) { die("foulmouth"); }
1 голос
/ 16 декабря 2009

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

$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 . Это также гарантирует, что проверка ключа массива не бомбит.

1 голос
/ 16 декабря 2009

Возможно, вы захотите сравнить это с подходами 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
}
1 голос
/ 16 декабря 2009

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);
0 голосов
/ 16 декабря 2009

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

$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 () возвращает массив плохих слов, так что если count () равен 0, то ничего плохого не было сказано

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