检查字符串是否包含多个特定单词

Jes*_*gmn 40 php

如果字符串包含多个特定单词,如何检查?

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

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

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

$data = "text text text text text text text bad text text naughty";
if (strpos($data, 'bad || naughty') !== false) {
    echo 'true';
}
?>
Run Code Online (Sandbox Code Playgroud)

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

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

chr*_*her 59

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

就像是:

if(preg_match('(bad|naughty)', $data) === 1) { } 
Run Code Online (Sandbox Code Playgroud)

你的尝试不起作用的原因

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

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

  • 请注意,如果模式与给定主题匹配,`preg_match`将返回int值`1`,但不是'true`.将`=== true`替换为`=== 1`或`!== 0`.见http://php.net/manual/en/function.preg-match.php#refsect1-function.preg-match-returnvalues (2认同)

小智 26

你做不到这样的事情:

if (strpos($data, 'bad || naughty') !== false) {
Run Code Online (Sandbox Code Playgroud)

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

if(preg_match("/(bad|naughty|other)/i", $data)){
 //one of these string found
}
Run Code Online (Sandbox Code Playgroud)

  • 这是非常好的@christopher示例没有奏效但你的工作:if(preg_match("/(bad | naughty | other)/ i",$ data)){//其中一个找到的字符串} (2认同)

Ein*_*eki 11

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

常用表达

if(preg_match("/\b(bad|naughty)\b/", $data)){
    echo "Found";
}
Run Code Online (Sandbox Code Playgroud)

(如果字符串中存在匹配,则preg_match返回1,否则返回0).

多个str_pos调用

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

爆炸

if (count(array_intersect(explode(' ', $data),array('bad','naugthy')))) {
    echo "Found";
}
Run Code Online (Sandbox Code Playgroud)

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

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

第二个是直截了当但不能区分坏人坏人.

如果第三个字符串用空格分隔,则第三个字符串将字符串拆分,选项卡字符将破坏您的结果.


mag*_*com 8

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

以上不太正确.

"如果模式与给定主题匹配,则preg_match()返回1,否则返回0;如果发生错误,则返回FALSE."

所以应该只是:

if(preg_match('[bad|naughty]', $data)) { }
Run Code Online (Sandbox Code Playgroud)