4

我正在尝试在 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';
}

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

4

6 回答 6

8

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

$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.";
    }
}
于 2013-10-04T09:54:56.673 回答
6

Read it somewhere:

if(preg_match('[word1|word2]', $a)) { } 
于 2013-10-04T09:56:10.587 回答
1

如果你有一个固定数量的单词,不是太大,你可以很容易地把它变成这样:

$a = 'How are you ?';

if (strpos($a,'are') !== false || strpos($a,'you') !== false || strpos($a,'How') !== false) {
echo 'true';
}
于 2013-10-04T09:54:42.493 回答
1
if (strpos($ro1['title'], $search)!==false or strpos($ro1['description'], $search)!== false or strpos($udetails['user_username'], $search)!== false)
{
//excute ur code
}
于 2016-10-20T11:39:39.673 回答
0

如果您需要多字节保存版本。尝试这个

 /**
 * Determine if a given string contains a given substring. 
 *
 * @param  string  $haystack
 * @param  string|string[]  $needles
 * @param bool $ignoreCase
 * @return bool
 */
public static function contains($haystack, $needles, $ignoreCase = false)
{
    if($ignoreCase){
        $haystack= mb_strtolower($haystack);
        $needles = array_map('mb_strtolower',$needles);
    }
    foreach ((array) $needles as $needle) {
        if ($needle !== '' && mb_strpos($haystack, $needle) !== false) {
            return true;
        }
    }

    return false;
}
于 2021-08-26T09:55:26.200 回答
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;
}
于 2021-07-02T11:02:17.367 回答