在PHP中使用in_array通配符匹配

5

我正在一个数组中存储一系列禁用词:

$bad = array("test");

我正在使用以下代码来检查用户名是否匹配:

if (in_array ($username, $bad))
{
//deny
}

但是我有一个问题,它只会拒绝给定的用户名为test,但我希望它也能拒绝给定的用户名为Test、TEST、thisisatestok或ThisIsATestOk。

这可行吗?


使用 strpos 作为示例,或者阅读有关正则表达式和 preg_* 函数的内容。 - u_mulder
4个回答

4
虽然其它答案使用了正则表达式和preg_*函数族,但是你最好使用stripos(),因为仅仅为了查找字符串中的某些内容而使用preg_*函数是不好的编程实践,而且stripos的速度更快。然而,stripos并不能接受针的数组作为参数,所以我写了一个函数来完成这个任务:
function stripos_array($haystack, $needles){
    foreach($needles as $needle) {
        if(($res = stripos($haystack, $needle)) !== false) {
            return $res;
        }
    }
    return false;
}

如果找到匹配项,此函数将返回偏移量,否则返回false。
示例案例:

$foo = 'evil string';
$bar = 'good words';
$baz = 'caseBADcase';
$badwords = array('bad','evil');
var_dump(stripos_array($foo,$badwords));
var_dump(stripos_array($bar,$badwords));
var_dump(stripos_array($baz,$badwords));
# int(0)
# bool(false)
# int(4)

使用示例:

if(stripos_array($word, $evilwords) === false) {
    echo "$word is fine.";
}
else {
    echo "Bad word alert: $word";
}

4
通过使用不区分大小写的正则表达式过滤数组中的每个单词,您可以获得包含目标词语的单词列表。
<?php
$haystack = array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday');
$needle = 'DAY';
$matches = array_filter($haystack, function($var){return (bool)preg_match("/$needle/i",$var);});
print_r($matches);

输出:

Array
(
    [0] => sunday
    [1] => monday
    [2] => tuesday
    [3] => wednesday
    [4] => thursday
    [5] => friday
    [6] => saturday
)

请详细说明您的回答。 - simbabque
虽然这可能回答了问题,但通常至少要添加一些注释或解释,以便人们实际上可以学到东西而不是复制/粘贴代码。 - Jasper
感谢您的建议,已经详细说明了答案 :) - xdebug

1
$example = array('An example','Another example','One Example','Last example');
$searchword = 'last';
$matches = array();
foreach($example as $k=>$v) {
    if(preg_match("/\b$searchword\b/i", $v)) {
        $matches[$k] = $v;
    }
}

使用子字符串和不区分大小写。
在此找到:搜索包含字符串的PHP数组元素

0

你可以使用 strtolower()

$words = array('i', 'am', 'very', 'bad');

$username = "VeRy";
$un = strtolower($username);

if (in_array($un, $words)){
    //found !
}

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