PHP in_array通配符匹配

时间:2015-01-07 09:24:23

标签: php

我在数组中存储了一系列禁止的单词:

$bad = array("test");

我使用以下代码检查用户名:

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

但是我有一个问题,它只是否认给定的用户名是否完全是测试,但是如果给定的用户名是Test,TEST,thisisatestok或ThisIsATestOk,我也希望它也拒绝。

有可能吗?

4 个答案:

答案 0 :(得分:2)

虽然其他答案使用正则表达式和preg_*系列,但您最好使用stripos(),因为bad practice仅使用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";
}

答案 1 :(得分:2)

通过使用不区分大小写的正则表达式过滤数组中的每个单词,可以得到包含针的单词列表。

<?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
)

答案 2 :(得分: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;
    }
}

使用子字符串和不区分大小写。

在此处找到:Search for PHP array element containing string

答案 3 :(得分:0)

您可以使用 strtolower()

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

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

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