我正在为我的网页制作一个php过滤器,它通过一个数组检查,通过一个文件读入,看看几个用户输入字段(名称,描述等)是否包含数组中的任何单词。我尝试使用内置于php中的“strpos”函数,但无论出于何种原因,它只检测到单词,如果单词是字符串中的最后一个东西,即如果我检查单词“cat”它会检测到它,如果它是检查“这是一只猫”和“粪便”,但不是检查“猫”或“猫玩具”,甚至只是“猫”,后面有空格。为了清楚起见,我确实检查了strpos函数是否不等于false(strpos(...)!== false)。所以我创建了自己的函数,将字符串分解为每个可能的子字符串,并检查每个字符串以查看它是否等于数组中的任何单词。有没有更快的方法可以做到这一点,或者我可以加快执行此代码的方式?这是代码:
function arrayContains($string, array $array){
$string = strtolower($string);
$len=strlen($string);
foreach($array as $check){
for($i=0; $i<$len; $i++){
for($j=1; $j<=$len-$i; $j++){
$sub=substr($string,$i,$j);
if($sub==$check)
return true;
}
}
}
return false;
}
答案 0 :(得分:1)
我怀疑你可能误导了strpos()
;要么以错误的顺序放置参数,要么不检查真正的布尔结果。这应该有效:
function foundInArray($string, $array){
$string = strtolower($string);
foreach($array as $check){
if (strpos($string, strtolower($check)) !== false) {
return true;
}
}
return false;
}
编辑以添加结果:
php > $array = ["foo", "bar", "baz"];
php > $string = "Cheese is a food I like";
php > var_dump(foundInArray($string, $array));
bool(true)
php > $string = "Cheese is a thing I like";
php > var_dump(foundInArray($string, $array));
bool(false)
答案 1 :(得分:0)
@developerwjk建议的这个答案有助于解决我的问题。如果有任何建议,我仍然愿意接受更多建议。
function arrayContains($string, array $array){
$string = strtolower($string);
$len=strlen($string);
for($i=0; $i<$len; $i++){
for($j=1; $j<=$len-$i; $j++){
$sub=substr($string,$i,$j);
if(in_array($sub, $array))
return true;
}
}
return false;
}