Регулярное выражение с preg_replace_callback используется для фильтра ненормативной лексики - PullRequest
0 голосов
/ 10 мая 2018

У меня была рабочая функция, которая получала массив плохих слов и заменяла плохие слова звездочками.

Когда я обновился до PHP7, мне пришлось использовать preg_replace_callback, поскольку модификатор preg_replace e устарел.

Вот как я это использовал:

function filterwords($text){

       $filterWords = array("dummy");
       $filterCount = sizeof($filterWords);

        for($i=0; $i<$filterCount; $i++){
            $text = preg_replace('/\b'.$filterWords[$i].'\b/ie',"str_repeat('*',strlen('$0'))",$text);
        }

 return $text;
}

Вот мой новый код:

echo filterwords("I am a dummy");

function filterwords($text){

    $filterWords = array("dummy");
    $filterCount = sizeof($filterWords);

    for($i=0; $i<$filterCount; $i++){

        $text = preg_replace_callback('/\b'.$filterWords[$i].'\b/i',
        function ($matches) {
            return str_repeat('*',strlen('$0'));
        },
        $text); 
    }

   return $text;
}

Это выводит "Я **" , но мой желаемый вывод "Я *****" (с 5 звездочками вместо 2).

1 Ответ

0 голосов
/ 10 мая 2018

Обратные ссылки, используемые в preg_replace, такие как $0, не имеют значения в preg_replace_callback. Вы передаете совпадения в функцию как $matches, но вы проверяете strlen('$0'), который представляет собой строку из 2 символов $0, поэтому вы получаете 2 *.

Используйте $matches и номер обратной ссылки. * Как вы привыкли, 0 - полное совпадение:

return str_repeat('*', strlen($matches[0]));
...