PHP: использование специальных символов в обфускаторе плохих слов - PullRequest
0 голосов
/ 23 сентября 2018

Я использую этот детектор / обфускатор плохих слов в 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('&squf;', 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!

Есть идеи, как решить эту проблему?Спасибо!

1 Ответ

0 голосов
/ 23 сентября 2018

Вы разбиваете многобайтовый символ пополам.Используйте mb_substr вместо substr.

return mb_substr($matches[0], 0, 1).str_repeat('&squf;', strlen($matches[0]) - 1);

https://3v4l.org/AnPJl

Возможно, вы также захотите использовать mb_strlen вместо strlen.

...