Php 从字符串中使用strpos查找坏单词
我有以下php代码来查找字符串中的坏单词 它在发现第一个坏单词时停止,并返回true 坏字以逗号分隔的列表形式提供,并转换为数组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
$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
不区分大小写。