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"则不起作用.
$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)
| 归档时间: |
|
| 查看次数: |
437 次 |
| 最近记录: |