47

如何检查一个字符串是否包含多个特定单词?

我可以使用以下代码检查单个单词:

$data = "text text text text text text text bad text text naughty";
if (strpos($data, 'bad') !== false) {
    echo 'true';
}

但是,我想添加更多单词来检查。像这样的东西:

$data = "text text text text text text text bad text text naughty";
if (strpos($data, 'bad || naughty') !== false) {
    echo 'true';
}

(如果找到这些词中的任何一个,那么它应该返回 true)

但是,上面的代码不能正常工作。任何想法,我做错了什么?

4

7 回答 7

84

为此,您将需要正则表达式preg_match函数。

就像是:

if(preg_match('(bad|naughty)', $data) === 1) { } 

您的尝试失败的原因

正则表达式由 PHP 正则表达式引擎解析。您的语法问题在于您使用了||运算符。这不是正则表达式运算符,因此它被视为字符串的一部分。

如上所述,如果它被视为您要匹配的字符串的一部分:'bad || naughty'作为字符串,而不是表达式!

于 2013-04-07T12:31:38.720 回答
33

你不能做这样的事情:

if (strpos($data, 'bad || naughty') !== false) {

相反,您可以使用正则表达式:

if(preg_match("/(bad|naughty|other)/i", $data)){
 //one of these string found
}
于 2013-04-07T12:30:41.053 回答
14

strpos确实搜索您作为第二个参数传递的确切字符串。如果要检查多个单词,则必须使用不同的工具

常用表达

if(preg_match("/\b(bad|naughty)\b/", $data)){
    echo "Found";
}

preg_match如果字符串中有匹配则返回 1,否则返回 0)。

多个 str_pos 调用

if (strpos($data, 'bad')!==false or strpos($data, 'naughty')!== false) {
    echo "Found";
}

爆炸

if (count(array_intersect(explode(' ', $data),array('bad','naugthy')))) {
    echo "Found";
}

对我来说,首选的解决方案应该是第一个。很明显,由于使用了正则表达式,可能效率不高,但它不会报告误报,例如,如果字符串包含单词badmington ,它不会触发回显

如果正则表达式有很多单词,则创建它可能会成为负担(尽管没有什么是你无法用一行 php 解决的$regex = '/\b('.join('|', $badWords).')\b/';

第二个是直截了当的,但无法区分badbadmington

如果字符串用空格分隔,第三个将字符串拆分为单词,制表符会破坏您的结果。

于 2013-04-07T12:52:06.450 回答
8

if(preg_match('[bad|naughty]', $data) === true) { }

上面说的不太对。

“preg_match() 如果模式匹配给定的主题,则返回 1,如果不匹配,则返回 0,如果发生错误,则返回 FALSE。”

所以它应该只是:

if(preg_match('[bad|naughty]', $data)) { }
于 2014-12-28T09:39:49.767 回答
3

substr_count()

我想添加另一种方法substr_count()(在所有其他答案之上):

if (substr_count($data, 'bad') || substr_count($data, 'naughty')){
    echo "Found";
}

substr_count()正在计算字符串出现的次数,所以当它为 0 时,你就知道它没有找到。我会说这种方式比使用str_pos()(其中一个答案中提到)更具可读性:

if (strpos($data, 'bad')!==false || strpos($data, 'naughty')!== false) {
    echo "Found";
}
于 2019-09-23T13:29:11.500 回答
2

你必须 strpos 每个单词。现在您正在检查是否有一个字符串说明

'bad || naughty'

这不存在。

于 2013-04-07T12:30:48.817 回答
0

使用数组作为要测试的单词和array_reduce()函数的简单解决方案:

$words_in_data = array_reduce( array( 'bad', 'naughty' ), function ( $carry, $check ) use ( $data ) {
    return ! $carry ? false !== strpos( $data, $check ) : $carry;
} );

然后你可以简单地使用:

if( $words_in_data ){
    echo 'true';
}
于 2021-04-21T23:10:52.337 回答