PHP Замена ругательств на фразы

Итак, я понимаю, как заменить одни слова другими. То, что я пытаюсь выяснить, - это как взять слово, заменить его фразой и исключить все остальные входные данные.

Например:

плохое слово "собака"

пользовательские вводы -> "Ты пахнешь как собака".

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

Вот что у меня есть для кода:

<?php

$find = array('dog', 'cat', 'bird');
$replace = 'You are a potty mouth.';

if (isset ($_POST['user_input'])&&!empty($_POST['user_input'])) {
    $user_input = $_POST['user_input']; 
    $user_input_new = str_ireplace($find, $replace, $user_input);

        echo $user_input_new;
}
?>

С этим кодом это звучит так: "Ты пахнешь как Ты - трусливый рот".

Я уверен, что это репост, и я прошу прощения. Все, что я смог найти, это документация о том, как заменить только части строк, а не целые.

4 ответа

Решение

Что ж, в этом случае вы можете просто проверить, есть ли в строке ввода пользователя "плохое слово", и, если оно возвращает true, выведите "You are the poty mouth".

Вы хотели бы использовать strpos()

например

if( strpos($_POST['user_input'],'dog')!==FALSE ) {
    echo('You are a potty mouth');
}

Если у вас есть массив "плохих слов", вы можете просмотреть их, чтобы проверить, что происходит в пользовательском вводе.

Вот альтернативное решение, сопоставьте слова и замените на * len of str. это не будет совпадать с такими словами, как Сканторп, так как он использует границы слов. Также вы можете добавить третий параметр, чтобы показать первые буквы слова, чтобы вы знали, какое слово было сказано, не видя его.

<?php
$badwords = array('*c word', '*f word','badword','stackru');

function swear_filter($str,$badwords,$reveal=null) {
    //Alternatively load from file
    //$words = join("|", array_filter(array_map('preg_quote',array_map('trim', file('badwords.txt')))));


    $words = join("|", array_filter(array_map('preg_quote',array_map('trim', $badwords))));
    if($reveal !=null && is_numeric($reveal)){
        return preg_replace("/\b($words)\b/uie", '"".substr("$1",0,'.$reveal.').str_repeat("*",strlen("$1")-'.$reveal.').""', $str);
    }else{
        return preg_replace("/\b($words)\b/uie", '"".str_repeat("*",strlen("$1")).""', $str);
    }

}


$str="There was a naughty Peacock from Scunthorpe and it said a badword, on stackru";

//There was a naughty Peacock from Scunthorpe and it said a b******, on s************
echo swear_filter($str,$badwords,1);

//There was a naughty Peacock from Scunthorpe and it said a *******, on *************
echo swear_filter($str,$badwords);
?>

Вы не хотите заменять плохие слова, а целую строку, поэтому вы должны просто сопоставить, и, если соответствует, установить всю строку в вашей замещающей строке.

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

Этот простой пример использует границы слов в регулярном выражении, чтобы соответствовать вашим словам (в примере это будет цикл с циклом над массивом плохих слов):

foreach ($find as $your_word)
{
  $search = '/\b' . preg_quote($your_word) . '\b/i';
  if (preg_match($search, $_POST['user_input']) === 1)
  {
    // a match is found, echo or set it to a variable, whatever you need
    echo $replace;
    // break out of the loop
    break;
  }
}

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

define("MIN_SAFE_WORD_LIMIT", 3);
$safe = true;
$whiteList = array();
$blackList = array();

$text = 'Test words fRom a piece of text.';

$blCount = count($blackList);

for($i=0; $i<$blCount; $i++) {
    if((strlen($blackList[$i]) >= MIN_SAFE_WORD_LIMIT) && strstr(strtolower($text), strtolower($blackList[$i])) && !strstr(strtolower($text), strtolower($whiteList[$i]))) {
        $safe = false;
    }
}

if(!$safe) {
    // Unsafe, flag for action
    echo 'Unsafe';
} else {
    echo $text;
}
Другие вопросы по тегам