Поэтому я понимаю, как заменить определенные слова на другие. Я пытаюсь понять, как взять слово и заменить его фразой и устранить все остальные данные.
Например:
Плохое слово – «собака»
пользовательские входы -> «Вы чувствуете запах как собака».
вместо того, чтобы заменить «собаку» на «радугу» или что-то в этом роде, я хочу, чтобы это звучало так: «Ты гордый рот».
Вот что я имею для кода:
<?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; } ?>
С помощью этого кода это звучит так: «Ты пахнешь, как« Ты горшок ».
Я уверен, что это репост, и я прошу прощения. Все, что мне удалось найти, это документация о том, как заменить только части строк, а не целые.
Ну, в этом случае вы можете просто проверить, есть ли «неправильное слово» в строке ввода пользователя, и если он возвращает true, эхо «Ты гордый рот».
Вы хотели бы использовать strpos ()
например
if( strpos($_POST['user_input'],'dog')!==FALSE ) { echo('You are a potty mouth'); }
Если у вас есть массив «плохих слов», вы захотите пропустить их, чтобы проверить, что происходит внутри пользовательского ввода.
Недавно я рассматривал ту же проблему, вот сценарий, над которым я работал, чтобы отфильтровать определенные слова. Все еще выполняется работа, но у нее есть возможность выводить пользовательское сообщение или настраиваемое сообщение. Надеюсь, это поможет вам или направит вас в правильном направлении.
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; }
Вы не хотите заменять плохие слова, но всю строку, поэтому вы должны просто сопоставлять, и если они совпадают, установите целую строку в свою заменяющую строку.
Кроме того, как указано в комментариях, слова могут быть частью другого, действительного слова, поэтому, если вы хотите принять это во внимание, вы должны соответствовать только целым словам.
Этот простой пример использует границы слов в регулярном выражении для соответствия вашим словам (в примере это было бы в цикле, зацикливаясь на вашем массиве плохих слов):
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; } }
Heres альтернативное решение, сопоставить слова и заменить на * len str. это не совпадает с такими словами, как Scunthorpe, поскольку использует границы слов. Также вы можете добавить третий параметр, чтобы открыть первые буквы этого слова, чтобы вы знали, какое слово было сказано, не видя его.
<?php $badwords = array('*c word', '*f word','badword','stackoverflow'); 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 stackoverflow"; //There was a naughty Peacock from Scunthorpe and it said ab******, 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); ?>