Разобрать строку - удалить некоторые слова из строки [дубликат]


На этот вопрос уже есть ответ здесь:

У меня есть строка типа:

$text = 'Hello this is my string and texts';

У меня есть некоторые недопустимые слова в массиве:

$filtered_words = array(
            'string',
            'text'
        );

Я хочу заменить все отфильтрованные слова в моем $text на ***, поэтому я написал:

$text_array = explode(' ', $text);
        foreach($text_array as $key => $value){
            if(in_array($text_array[$key], $filtered_words)){
                $text = str_replace($text_array[$key], '***', $text);
            }
        }
echo $text;

В Вывод:

Hello this is my *** and texts

Но мне нужна функция, чтобы также заменить texts на ***, поскольку она также содержит отфильтрованное слово (текст).

Как я мог бы этого добиться?

Спасибо

Author: hakre, 2013-02-17

2 answers

Вы можете просто сделать это прямо сейчас, str_replace поддерживает замену из массива в одну строку:

$text = 'Hello this is my string and texts';

$filtered_words = array(
    'string',
    'texts',
    'text',
);

$zap = '***';

$filtered_text = str_replace($filtered_words, $zap, $text);

echo $filtered_text;

Вывод (Демонстрация):

Hello this is my *** and ***

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

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

 10
Author: hakre, 2013-02-17 08:08:48

Str_replace может принимать массив в качестве первого параметра. Так что нет необходимости в каком-либо цикле for each вообще:

$filtered_words = array(
    'string',
    'text'
);
$text = str_replace($filtered_words, '***', $text);
 2
Author: dfsq, 2013-02-17 07:53:01