【问题标题】:Does array element contain substring? [duplicate]数组元素是否包含子字符串? [复制]
【发布时间】:2013-11-06 06:44:12
【问题描述】:

我想要一个函数来检查数组的项目是否包含一个字符串。 因此:

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

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

我走了这么远:

$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 时也能回显。

这可能(以及如何)?

【问题讨论】:

  • 我认为这与stackoverflow.com/questions/4366730/… 没有太大的重复——字符串数组肯定具有与字符串不同的质量,我正在考虑使用正则表达式来实现这一点。一个对象怎么能把这个“标记为重复”呢?

标签: php arrays string contains


【解决方案1】:

循环遍历$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";
}

Demo!

【讨论】:

  • 这允许“admin12”回显 true,而我希望它回显“this is a...”,因为“admin12”(输入)包含“Admin”(来自 fn 数组)。
  • @Isaiah:这是我的一个小错误。我不小心切换了stripos() 的参数。请查看更新后的答案(和demo
【解决方案2】:
foreach ($forbiddennames as $forbiddenname) {
    $nametocheck = strtolower($stringtocheck);
    if(strpos($stringtocheck, $forbiddenname) !== false) {
        echo "This is a forbidden username.";
        break;
    }
}

【讨论】:

  • 您应该检查 !==,因为如果找到匹配项,strpos 也可能返回 0
  • 是的,完全正确
【解决方案3】:

使用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';
}

【讨论】:

  • 也可以,谢谢!
【解决方案4】:

你想要 PHP 的“strpos”函数。循环遍历每个数组元素,然后根据 'strpos' PHP strpos reference 检查每个元素

foreach($forbiddennames as $fn){
 if(strpos($stringtocheck,$fn)){
  //found it!
 }else{
  //not found!
 }
}

【讨论】:

  • 如果发现无效名称后有可能中断,为什么还要遍历整个数组?
  • 如果您想要不区分大小写的搜索,'strripos' 会更好。我会在“strpos”上使用它,但代码示例基本相同
  • @ChrisWesson:那是不同的。我想你的意思是stripos()(有一个R):)
  • 字。一个'r'。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 2019-03-13
  • 2021-05-02
  • 2021-12-14
  • 1970-01-01
  • 2013-10-03
相关资源
最近更新 更多