数组元素是否包含子字符串?

19
我想要一个函数,用于检查数组中的元素是否包含某个字符串。 因此,代码如下所示:
array(1 => 'Super-user', 'Root', 'Admin', 'Administrator', 'System', 'Website', 'Owner', 'Manager', 'Founder');

然后检查admin12应该返回true,因为admin12admin的一部分)也是数组的一部分。

我已经做到了这一步:

$forbiddennames= array(1 => 'Super-user', 'Root', 'Admin', 'Administrator', 'System', 'Website', 'Owner', 'Manager', 'Founder');    

if(in_array( strtolower($stringtocheck), array_map('strtolower', $forbiddennames))){
        echo '"This is a forbidden username."';
    } else {
        echo 'true';
    }
}

当我检查admin时,只有这个才会回显“这是一个禁止使用的用户名”。 我也希望在检查admin12时回显。

这是否可能(以及如何实现)?


4
我不认为这与 https://dev59.com/3m855IYBdhLWcg3wZzXf 是完全重复的。字符串数组与普通字符串有明显不同之处,而我想用正则表达式来解决这个问题。有什么办法可以反对将它标记为“重复”? - the
4个回答

8

循环遍历$forbiddennames数组,并使用stripos检查给定输入字符串是否与数组中的任何项匹配:

function is_forbidden($forbiddennames, $stringtocheck) 
{
    foreach ($forbiddennames as $name) {
        if (stripos($stringtocheck, $name) !== FALSE) {
            return true;
        }
    }
}

然后像下面这样使用:

if(is_forbidden($forbiddennames, $stringtocheck)) {
    echo "This is a forbidden username.";
} else {
    echo "True";
}

演示!


这使得“admin12”回显为true,然而我想让它回显“this is a…”,因为“admin12”(输入)包含了f.n.数组中的“Admin”。 - Isaiah
@Isaiah:这只是我犯的一个小错误。我不小心交换了 stripos() 的参数。请查看更新后的答案(以及demo)。 - Amal Murali

3
foreach ($forbiddennames as $forbiddenname) {
    $nametocheck = strtolower($stringtocheck);
    if(strpos($stringtocheck, $forbiddenname) !== false) {
        echo "This is a forbidden username.";
        break;
    }
}

你应该检查 !==,因为如果找到匹配,strpos 也可能返回0。 - Rangad
是的,完全正确。 - Ash

2

无论您使用array_map、foreach还是其他方法,都没有关系。可能的解决方案:

$forbiddenNames = array('admin', 'bannedName');
$input = 'Admin12';
$allowed = true;
foreach($forbiddenNames as $forbiddenName) {
    if(stripos($input, $forbiddenName) !== false) {
        echo $input, ' is invalid';
        $allowed = false;
        break;
    }
}
if($allowed === true) {
    echo $input, ' is valid';
}

一样有效,谢谢! - Isaiah

2
你需要使用PHP的 'strpos' 函数。循环遍历每个数组元素,然后对每个元素使用 'strpos' 进行检查。参考PHP strpos文档
foreach($forbiddennames as $fn){
 if(strpos($stringtocheck,$fn)){
  //found it!
 }else{
  //not found!
 }
}

如果发现无效名称后有可能中断,为什么要遍历整个数组? - Rangad
如果您想进行不区分大小写的搜索,“strripos”更好。我会使用它而不是“strpos”,但代码示例基本相同。 - Chris Wesson
1
@ChrisWesson:那不太一样。我想你是指 stripos()(只有一个 R) :) - Amal Murali
单词。一个'r'。谢谢! - Chris Wesson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接