Возможный дубликат:
Эффективный способ проверки строки для определенных слов
Я хочу проверить, содержит ли строка какое-либо из этих слов: запрет, плохой, пользовательский, пропуск, стек, имя, html .
Если в нем содержится какое-либо из слов, мне нужно повторить количество плохих слов
str = 'Hello my name is user';
Я думаю, что что-то вроде этого будет работать:
$badWords = array("ban","bad","user","pass","stack","name","html"); $string = "Hello my name is user."; $matches = array(); $matchFound = preg_match_all( "/\b(" . implode($badWords,"|") . ")\b/i", $string, $matches ); if ($matchFound) { $words = array_unique($matches[0]); foreach($words as $word) { echo "<li>" . $word . "</li>"; } echo "</ul>"; }
Это создает массив запрещенных слов и использует регулярное выражение для поиска экземпляров этих слов:
\b
в Regex указывает границу слова (т.е. начало или конец слова, определяемое либо началом / концом строки, либо символом без слова). Это делается для предотвращения «критических» ошибок – т. Е. Вы не хотите запрещать слово «баннер», когда хотите только совместить слово «запрет».
Функция implode
создает единственную строку, содержащую все ваши запрещенные слова, разделенные символом pipe, который является оператором or
в Regex.
Часть implode
в Regex окружена круглыми скобками, так что preg_match_all
будет захватывать запрещенное слово как совпадение.
Модификатор i
в конце Regex указывает, что совпадение должно быть чувствительным к регистру – то есть оно будет соответствовать каждому слову независимо от его капитализации – «Запрет», «запрет» и «BAN» будут соответствовать совпадению слова «запрет» в $badWords
.
Затем код проверяет, были ли найдены совпадения. Если есть, он использует array_unique
чтобы сообщать только один экземпляр каждого слова, а затем выводит список совпадений в неупорядоченном списке.
Это то, что вы ищете?
Это то, что вы хотите.
function teststringforbadwords($string,$banned_words) { foreach($banned_words as $banned_word) { if(stristr($string,$banned_word)){ return false; } } return true; } $string = "test string"; $banned_words = array('ban','bad','user','pass','stack','name','html'); if (!teststringforbadwords($string,$banned_words)) { echo 'string is clean'; }else{ echo 'string contains banned words'; }
\ B в шаблоне указывает границу слова, поэтому сопоставляется только отдельное слово «сеть», а не слово, такое как «webbing» или «паутина»,
if (preg_match ("/ \ bweb \ b / i", "PHP – это язык веб-скриптов по выбору.")) {echo "найдено совпадение."; } else {echo "Совпадение не найдено."; }
if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) { echo "A match was found."; } else { echo "A match was not found."; }
Это ваш лучший выбор. Как указано в начале, вы можете управлять своим регулярным выражением.
Это прямо из php.net
function check_words($text) { $text=$text; $bad_words = file('bad_words.txt'); $bad = explode(" | ",$bad_words[0]); $b = '/\W' . implode('\W|\W', $bad) . '\W/i'; if(preg_match($b, $text)){ echo $text ." - Contain Bad words!"; other function here } else { echo $text ." - Not containing bad words :D"; // other function here } }
Пример: check_words('He is good');
Это работает хорошо, хотя что-либо после финала /
, похоже, не проверяется, например, http://www.mysite.com/thisbit
, этот thisbit
не может быть проверен на наличие плохих слов.
Он снова работает, как только он набирается следующим образом: http://www.mysite.com/thisbit/
, с завершающим /
.
Не уверен, что это можно исправить или нет.
function check_words($text) { $text=$text; $bad_words = file('bad_words.txt'); $bad = explode(" | ",$bad_words[0]); $b = '/\W' . implode('\W|\W', $bad) . '\W/i'; if(preg_match($b, $text)){ echo $text ." - Contain Bad words!"; # - other function here } else{ echo $text ." - Not containing bad words :D"; # - other function here } } # - Example check_words('He is good');
Надеюсь, это поможет .. вы можете поместить все плохие слова в файл bad_words.txt .
Упорядочить плохие слова в txt как:
bad_words1 | bad_words2 | bad_words3 | bad_words4 ...
Примечание: вы также можете добавить что-то вроде:
bad words 1 | bad words 2 | bad words 3
пока он находится в «|» формат.