发誓过滤箱敏感

时间:2011-08-14 01:02:31

标签: php filter case-sensitive

我的功能有点问题:

function swear_filter($string){
    $search = array(
        'bad-word',
    );
    $replace = array(
        '****',
    );
    return preg_replace($search , $replace, $string);
}

它应该将“坏词”转换为“ * *”,但问题是案例敏感度

例如。如果用户输入“baD-word”则不起作用。

3 个答案:

答案 0 :(得分:5)

$search数组中的值不是正则表达式。

首先,修复:

$search = array(
    '/bad-word/',
);

然后,您可以将i标志应用于不区分大小写:

$search = array(
    '/bad-word/i',
);

您不需要g标记来全局匹配 (即每次不止一次),因为preg_replace会为您处理。

但是,你可以使用the word boundary metacharacter \b来避免在另一个词中匹配你的“坏词”字符串。这可能会影响您如何形成“坏词”列表。

$search = array(
    '/\bbad-word\b/i',
);

Live demo.


如果您不想使用这些实现细节污染$search,那么您可以通过编程方式执行相同的操作:

$search = array_map(
   create_function('$str', 'return "/\b" . preg_quote($str, "/") . "\b/i";'),
   $search
);

(我没有使用最近的PHP lambda语法,因为键盘不支持它;如果你感兴趣,请查阅它!)

Live demo.


更新完整代码:

function swear_filter($string){
    $search = array(
        'bad-word',
    );

    $replace = array(
        '****',
    );

    // regex-ise input
    $search = array_map(
       create_function('$str', 'return "/\b" . preg_quote($str, "/") . "\b/i";'),
       $search
    );

    return preg_replace($search, $replace, $string);
}

答案 1 :(得分:0)

我认为你的意思是

'/bad-word/i',

答案 2 :(得分:-1)

你甚至需要使用正则表达式吗?

function swear_filter($string){
    $search = array(
        'bad-word',
    );
    if (in_array(strtolower($string), $search){
        return '****';
    }
    return $search
}

做出以下假设。

1)$ string包含当前本地

中可接受的字符

2)$ search数组的所有内容都是小写

编辑:3)整个字符串由坏词

组成

我认为这只有在字符串被拆分并基于每个单词进行评估时才有效。