这个问题已经在这里有了答案:




已关闭8年。






我想检查一个字符串是否包含以下任何单词:禁止,错误,用户,通过,堆栈,名称,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>";
}

这将创建一个禁止单词数组,并使用regular expression查找这些单词的实例:

正则表达式中的
  • \b指示单词边界(即单词的开头或结尾,由字符串的开头/结尾或非单词字符确定)。这样做是为了防止"clbuttic" mistakes-也就是说,当您只想匹配单词“ban”时,您不想禁用单词“banner”。
  • implode 函数创建一个字符串,其中包含您所有禁止的单词,并用竖线字符分隔,即正则表达式中的or运算符。
  • 正则表达式的implode部分用括号括起来,因此 preg_match_all 将捕获被禁止的单词作为匹配项。
  • 正则表达式末尾的i修饰符表示匹配应区分大小写-即,它将匹配每个单词,而不考虑大小写-“Ban,” ban“和” BAN“都将与单词” ban“匹配在$badWords数组中。

    接下来,代码检查是否找到任何匹配项。如果存在,它将使用 array_unique 来确保仅报告每个单词的一个实例,然后以无序列表的形式输出匹配项列表。

    这是您要找的东西吗?

  • 08-06 09:13