Php 从字符串中使用strpos查找坏单词

Php 从字符串中使用strpos查找坏单词,php,Php,我有以下php代码来查找字符串中的坏单词 它在发现第一个坏单词时停止,并返回true 坏字以逗号分隔的列表形式提供,并转换为数组 $paragraph = "We have fur to sell"; $badWords = "sis, fur"; $badWordsArray = explode(",", $badWords); function strpos_arr($string, $array, $offset=0) { // Find array values in string

我有以下php代码来查找字符串中的坏单词

它在发现第一个坏单词时停止,并返回true

坏字以逗号分隔的列表形式提供,并转换为数组

$paragraph = "We have fur to sell";
$badWords = "sis, fur";
$badWordsArray = explode(",", $badWords);

function strpos_arr($string, $array, $offset=0) { // Find array values in string
    foreach($array as $query) {
        if(strpos($string, $query, $offset) !== false) return true; // stop on first true result for efficiency
    }
    return false;
}

strpos_arr($paragraph, $badWordsArray);
问题是,如果提供的坏单词是另一个单词的一部分,那么它也会返回true

我更喜欢使用strop。
还请建议是否有更有效的方法来查找坏单词。

只需在搜索字符串中包含空格即可

$paragraph = "We have fur to sell";
$badWords = "sis, fur";
$badWordsArray = explode(",", $badWords);

function strpos_arr($string, $array, $offset=0) { // Find array values in string

$string = " ".$string." ";

foreach($array as $query) {
    $query = " ".$query." ";
    if(strpos($string, $query, $offset) !== false) return true; // stop on first true result for efficiency
}
return false;
}

strpos_arr($paragraph, $badWordsArray);

使用reqular表达式尝试以下操作:

$paragraph = "We have fur to sell";
$badWords = "sis, fur";
$badWordsArray = preg_split('/\s*,\s*/', $badWords, -1, PREG_SPLIT_NO_EMPTY);
var_dump($badWordsArray);

function searchBadWords($string, $array, $offset=0) { // Find array values in string
    foreach ($array as $query) {
        if (preg_match('/\b' . preg_quote($query, '/') . '\b/i', $string)) return true; // stop on first true result for efficiency
    }
    return false;
}

var_dump(searchBadWords($paragraph, $badWordsArray));
说明:

首先。我们希望正确分割
$badWords
字符串:

$badWordsArray = preg_split('/\s*,\s*/', $badWords, -1, PREG_SPLIT_NO_EMPTY);
这样,我们将正确地将字符串(如
“sis,fur”
“sis,fur”
甚至
“sis,fur”
拆分为
数组('sis','fur')


然后,我们使用
\b
元字符对确切的单词执行regexp搜索。就正则表达式而言,这意味着
word boundary
,即在一个单词字符和一个非单词字符之间的位置。

尝试使用regexI。我不知道如何将regex与strop一起使用。您还可以分解输入字符串<代码>$paragraphArray=分解(“,$paragraphArray)然后在数组函数中使用
foreach($pgItem的paragraphArray){if(in_array($pgItem,$badWordsArray)){//是一个坏字}否则{//不坏}
@Janno,如果坏字是字符串中的第一个字,它就不起作用了。@Syed,看看我的答案,它使用regex。谢谢你的回复,如果坏字是字符串中的第一个或最后一个字,它就不起作用了。你测试了新代码吗?(它有一个新行:
$string=”“.$string.“;
)谢谢@spirit,在这种情况下,你认为
preg_match
strop
更有效吗。如果你需要搜索准确的单词-是
strpos
更快,但它需要额外的代码才能实现精确搜索。或者,您可以
preg_split()
您的
$段落
并使用
in_array()
=)我即将接受您的答案,请对我的问题进行投票并使
preg_match
不区分大小写。