Как заменить плохие слова на php? - PullRequest
2 голосов
/ 20 июня 2009

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

$bad_words = array(
  'word1' => 'gosh',
  'word2' => 'darn',
);

Я могу пройтись по ним и заменить по одному, но это медленно, верно? Есть ли лучший способ?

Ответы [ 3 ]

3 голосов
/ 20 июня 2009

Да, есть. Используйте preg_replace_callback():

<?php
header('Content-Type: text/plain');

$text = 'word1 some more words. word2 and some more words';
$text = preg_replace_callback('!\w+!', 'filter_bad_words', $text);
echo $text;

$bad_words = array(
  'word1' => 'gosh',
  'word2' => 'darn',
);

function filter_bad_words($matches) {
  global $bad_words;
  $replace = $bad_words[$matches[0]];
  return isset($replace) ? $replace : $matches[0];
}
?>

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

ОБНОВЛЕНИЕ (9/11/2016)

Я понимаю, что это 7 лет, но новые версии php, похоже, выдают исключение, если проверяемое слово отсутствует в массиве $bad_words. Чтобы исправить это, я изменил последние две строки filter_bad_words() следующим образом:

$replace = array_key_exists($matches[0], $bad_words) ? $bad_words[$matches[0]] : false;
return $replace ?: $matches[0];
0 голосов
/ 20 июня 2009

Вроде так:

function clean($array, $str) {
    $words = array_keys($array);
    $replacements = array_values($array);

    return preg_replace($words, $replacements, $str);
}
0 голосов
/ 20 июня 2009

str_ireplace () может принимать массив как для поиска, так и для замены аргументов. Вы можете использовать его со своим существующим массивом так:

$unfiltered_string = "gosh and darn are bad words";
$filtered_string = str_ireplace(array_vals($bad_words), array_keys($bad_words), $unfiltered_string);

// $filtered string now contains: "word1 and word2 are bad words"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...