检查字符串是否包含多个单词之一

时间:2013-10-04 09:51:24

标签: php string if-statement strpos

我正在尝试在php中创建一个单词过滤器,并且我遇到了之前的Stackoverlow帖子,它提到了以下内容以检查字符串是否包含某些单词。我想做的就是调整它,以便一次检查各种不同的单词,而不必一遍又一遍地重复代码。

$a = 'How are you ?';

if (strpos($a,'are') !== false) {
echo 'true';
}

如果我将代码修改为以下内容,它会起作用吗?......

$a = 'How are you ?';

if (strpos($a,'are' OR $a,'you' OR $a,'How') !== false) {
echo 'true';
}

添加多个单词以检查的正确方法是什么?。

5 个答案:

答案 0 :(得分:6)

要扩展当前代码,您可以使用目标字词数组进行搜索,并使用循环:

$a = 'How are you ?';

$targets = array('How', 'are');

foreach($targets as $t)
{
    if (strpos($a,$t) !== false) {
        echo 'one of the targets was found';
        break;
    }
}

请记住,以这种方式使用strpos()意味着可以找到部分单词匹配。例如,如果字符串ample中的目标为here is an example,则即使根据定义,单词ample不存在,也会找到匹配项。

对于整个单词匹配,preg_match()文档中有一个示例可以通过为多个目标添加循环来扩展:

foreach($targets as $t)
{
    if (preg_match("/\b" . $t . "\b/i", $a)) {
        echo "A match was found.";
    } else {
        echo "A match was not found.";
    }
}

答案 1 :(得分:4)

在某处阅读:

if(preg_match('[word1|word2]', $a)) { } 

答案 2 :(得分:1)

如果你有一个固定数量的单词,这个单词不是很大,你可以很容易地做到这样:

$a = 'How are you ?';

if (strpos($a,'are') !== false || strpos($a,'you') !== false || strpos($a,'How') !== false) {
echo 'true';
}

答案 3 :(得分:1)

if (strpos($ro1['title'], $search)!==false or strpos($ro1['description'], $search)!== false or strpos($udetails['user_username'], $search)!== false)
{
//excute ur code
}

答案 4 :(得分:0)

我使用 str_containspreg_match 构建方法来比较速度。

public static function containsMulti(?string $haystackStr, array $needlesArr): bool
{
    if ($haystackStr && $needlesArr) {
        foreach ($needlesArr as $needleStr) {
            if (str_contains($haystackStr, $needleStr)) {
                return true;
            }
        }
    }
    return false;
}

preg_match 总是慢很多(慢 2-10 倍,取决于几个因素),但如果你想扩展它以进行全字匹配等,可能会很有用。

public static function containsMulti(?string $haystackStr, array $needlesArr): bool
{
    if ($haystackStr && $needlesArr) {
        $needlesRegexStr = implode('|', array_map('preg_quote', $needlesArr));
        return (bool) preg_match('/(' . $needlesRegexStr . ')/', $haystackStr);
    }
    return false;
}