Я использую этот детектор / обфускатор плохих слов в php (чтобы соответствовать Adsense).Он показывает первую букву плохого слова и заменяет оставшиеся буквы следующим символом: ▪
Работает нормально, за исключением случаев, когда я использую слова, содержащие специальные символы на испанском языке, например: ñ, á, - и т. д.
Это мой текущий код:
<?
function badwords_full($string, &$bad_references) {
static $bad_counter;
static $bad_list;
static $bad_list_q;
if(!isset($bad_counter)) {
$bad_counter = 0;
$bad_list = badwords_list();
$bad_list_q = array_map('preg_quote', $bad_list);
}
return preg_replace_callback('~('.implode('|', $bad_list_q).')~',
function($matches) use (&$bad_counter, &$bad_references) {
$bad_counter++;
$bad_references[$bad_counter] = $matches[0];
return substr($matches[0], 0, 1).str_repeat('▪', strlen($matches[0]) - 1);
}, $string);
}
function badwords_list() {
# spanish
$es = array(
"gallina",
"ñoño"
);
# english
$en = array(
"chicken",
"horse"
);
# join all languages
$list = array_merge($es, $en);
usort($list, function($a,$b) {
return strlen($b) < strlen($b);
});
return $list;
}
$bad = []; //holder for bad words
Тест 1:
echo badwords_full('Hello, you are a chicken!', $bad);
Результат 1:
Здравствуйте, вы доступны. • • • • • •!(отлично работает)
Тест 2:
echo badwords_full('Hola en español eres un ñoño!', $bad);
Результат 2:
Holaen español eres un �¡ă¡ă¡@Mail.ru!
Есть идеи, как решить эту проблему?Спасибо!