Допустим, у меня есть множество плохих слов:
$badwords = array("one", "two", "three");
И случайная строка:
$string = "some variable text";
Как создать этот цикл:
if (one or more items from the $badwords array is found in $string) echo "sorry bad word found"; else echo "string contains no bad words";
Пример:
если $string = "one fine day" or "one fine day two of us did something"
, пользователь должен увидеть сообщение о жалком слове.
Если $string = "fine day"
, пользователь должен видеть, что строка не содержит сообщения о плохих словах.
Как я знаю, вы не можете preg_match
из массива. Какие-нибудь советы?
Как насчет этого:
$badWords = array('one', 'two', 'three'); $stringToCheck = 'some stringy thing'; // $stringToCheck = 'one stringy thing'; $noBadWordsFound = true; foreach ($badWords as $badWord) { if (preg_match("/\b$badWord\b/", $stringToCheck)) { $noBadWordsFound = false; break; } } if ($noBadWordsFound) { ... } else { ... }
Почему вы хотите использовать preg_match()
здесь?
Как насчет этого:
foreach($badwords as $badword) { if (strpos($string, $badword) !== false) echo "sorry bad word found"; else echo "string contains no bad words"; }
Если вам нужно preg_match()
по некоторым причинам, вы можете генерировать шаблон регулярного выражения динамически. Что-то вроде этого:
$pattern = '/(' . implode('|', $badwords) . ')/'; // $pattern = /(one|two|three)/ $result = preg_match($pattern, $string);
НТН
Если вы хотите проверить каждое слово, вставив строку в слова, вы можете использовать это:
$badwordsfound = count(array_filter( explode(" ",$string), function ($element) use ($badwords) { if(in_array($element,$badwords)) return true; } })) > 0; if($badwordsfound){ echo "Bad words found"; }else{ echo "String clean"; }
Теперь мне стало лучше, как насчет замены всех плохих слов из массива и проверить, остается ли строка такой же?
$badwords_replace = array_fill(0,count($badwords),""); $string_clean = str_replace($badwords,$badwords_replace,$string); if($string_clean == $string) { echo "no bad words found"; }else{ echo "bad words found"; }
Вот фильтр плохих слов, который я использую, и он отлично работает:
private static $bad_name = array("word1", "word2", "word3"); // This will check for exact words only. so "ass" will be found and flagged // but not "classic" $badFound = preg_match("/\b(" . implode(self::$bad_name,"|") . ")\b/i", $name_in);
Тогда у меня есть другая переменная с выделенными строками, чтобы она соответствовала:
// This will match "ass" as well as "classic" and flag it private static $forbidden_name = array("word1", "word2", "word3"); $forbiddenFound = preg_match("/(" . implode(self::$forbidden_name,"|") . ")/i", $name_in);
Затем я запускаю if
на нем:
if ($badFound) { return FALSE; } elseif ($forbiddenFound) { return FALSE; } else { return TRUE; }
Надеюсь это поможет. Спросите, не нужно ли мне разъяснять что-либо.