проверить, есть ли значение в массиве - PullRequest
1 голос
/ 10 марта 2011

Это, вероятно, v.easy, но мой PHP очень ржавый.Мне нужно реализовать фильтр плохих слов ... В настоящее время у меня есть это:

if(!in_array($_POST['Name'],$profanities)) { echo $row['Name']; }

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

спасибо

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

Технически есть несколько вариантов, и некоторые другие ответы указывают на это. Реально, однако, я бы сказал, не делайте этого.

Фильтры ненормативной лексики печально известны своим разочарованием и ограничением для пользователей с необычными или иностранными именами / адресами / и т. Д.

Пожалуйста, смотрите: http://en.wikipedia.org/wiki/Swear_filter#Unintended_consequences

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

РЕДАКТИРОВАТЬ: Существует отличный вопрос стека переполнения уже решает эту проблему. см. Как реализовать хороший фильтр ненормативной лексики?

РЕДАКТИРОВАТЬ: хотя вышеупомянутый вопрос stackoverflow относится к посту Джеффа об этом, не повредит повторить и усилить. Фильтры непристойности: плохая идея или невероятно плохая идея общения?

1 голос
/ 10 марта 2011

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

foreach($profanities as $profanity)
{
    if(preg_match('/' . $profanity . '/i', $row['Name']))
    {
        echo 'Bad word found!';
    }
}
1 голос
/ 10 марта 2011
$name = $_POST['Name'];

foreach($profanities as $profanity) {

   if (preg_match('/\w' . preg_quote($profanity, '/') . '\w/i', $name) {
      // Bad word on its own
   }

}

Это будет соответствовать плохому слову само по себе ... то есть оно будет соответствовать bad в Is it bad?, но не в baddy. Вы можете удалить границы слова, если вы хотите, чтобы соответствовать этому, или, возможно, попробуйте strstr().

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

Что если я захочу назвать свое имя пользователя после моего родного города ?

...