发誓过滤箱敏感

Dav*_*ave 0 php case-sensitive filter

我的功能有点问题:

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

它应该将"坏词"转换为" **",但问题是案例的敏感性

例如.如果用户输入"baD-word"则不起作用.

Lig*_*ica 5

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

首先,修复:

$search = array(
    '/bad-word/',
);
Run Code Online (Sandbox Code Playgroud)

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

$search = array(
    '/bad-word/i',
);
Run Code Online (Sandbox Code Playgroud)

您不需要全局g匹配标志(即每个标志不止一次),因为它会为您处理.preg_replace

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

$search = array(
    '/\bbad-word\b/i',
);
Run Code Online (Sandbox Code Playgroud)

现场演示.


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

$search = array_map(
   create_function('$str', 'return "/\b" . preg_quote($str, "/") . "\b/i";'),
   $search
);
Run Code Online (Sandbox Code Playgroud)

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

现场演示.


更新完整代码:

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);
}
Run Code Online (Sandbox Code Playgroud)