检查字符串是否包含数组中的单词

use*_*926 19 php arrays string compare

这是一个聊天页面.我有一个$string = "This dude is a mothertrucker".我有一系列坏话:$bads = array('truck', 'shot', etc).我怎么能检查是否$string包含任何单词$bad
到目前为止,我有:

        foreach ($bads as $bad) {
        if (strpos($string,$bad) !== false) {
            //say NO!
        }
        else {
            // YES!            }
        }
Run Code Online (Sandbox Code Playgroud)

除非我这样做,当用户键入$bads列表中的单词时,输出为NO!是的!所以由于某种原因,代码运行了两次.

Nir*_*ara 64

function contains($str, array $arr)
{
    foreach($arr as $a) {
        if (stripos($str,$a) !== false) return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了!为什么名单上这么低? (5认同)
  • 这只适用于我,如果我换掉`stripos($ str,$ a)`,因为字符串是大海捞针 (3认同)
  • 如果您的停用词是另一个词的一部分,这将不起作用,例如:如果其中一个词是“shed”并且字符串包含词“washed”。我正在考虑一个更具体的案例,比如包含“Essex”一词的字符串并试图阻止明确的垃圾邮件。 (2认同)

T.T*_*dua 12

1)最简单的方法:

if ( in_array( 'eleven',  array('four', 'eleven', 'six') ))
...
Run Code Online (Sandbox Code Playgroud)

2)另一种方式(在将阵列检查到另一个阵列时):

$keywords=array('one','two','three');
$targets=array('eleven','six','two');
foreach ( $targets as $string ) 
{
  foreach ( $keywords as $keyword ) 
  {
    if ( strpos( $string, $keyword ) !== FALSE )
     { echo "The word appeared !!" }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这两个例子都比这个问题的其他[答案](http://stackoverflow.com/a/13795849/630996)表现得更差.第一个因为它的编写具有O(1)的Big-O算法复杂度,但是为了使其在OP的原始问题下工作,人们将不得不遍历聊天消息中的所有单词,这将使其成为O. (N)(其中N是字符串中的单词数).由于聊天消息的长度可能不同,因此随着消息长度的增加,性能会降低.由于双循环,第二个是O(M*N). (2认同)

San*_*jay 9

你可以试试这个而不是你的代码

$string = "This dude is a mothertrucker";
$bads = array('truck', 'shot');
foreach($bads as $bad) {
    $place = strpos($string, $bad);
    if (!empty($place)) {
        echo 'Bad word';
        exit;
    } else {
        echo "Good";
    }
}
Run Code Online (Sandbox Code Playgroud)


Cli*_*ton 6

有一个非常短的 php 脚本,您可以使用它来识别字符串中的坏词,该脚本使用 str_ireplace ,如下所示:

$string = "This dude is a mean mothertrucker";
$badwords = array('truck', 'shot', 'ass');
$banstring = ($string != str_ireplace($badwords,"XX",$string))? true: false;
if ($banstring) {
   echo 'Bad words found';
} else {
    echo 'No bad words in the string';
}
Run Code Online (Sandbox Code Playgroud)

单行:

$banstring = ($string != str_ireplace($badwords,"XX",$string))? true: false;
Run Code Online (Sandbox Code Playgroud)

完成所有工作。

  • 我不确定您是否仔细查看了@Clinton 的答案。该方法仅使用 str_ireplace() 来识别是否存在坏词(作为条件的一部分),它实际上并不替换字符串。实际上这是一个相当巧妙的方法,并且比迭代每个单词进行检查要快得多。 (2认同)