我的功能有点问题:
function swear_filter($string){
$search = array(
'bad-word',
);
$replace = array(
'****',
);
return preg_replace($search , $replace, $string);
}
它应该将“坏词”转换为“ * *”,但问题是案例敏感度
例如。如果用户输入“baD-word”则不起作用。
答案 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',
);
如果您不想使用这些实现细节污染$search
,那么您可以通过编程方式执行相同的操作:
$search = array_map(
create_function('$str', 'return "/\b" . preg_quote($str, "/") . "\b/i";'),
$search
);
(我没有使用最近的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);
}
答案 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)整个字符串由坏词
组成我认为这只有在字符串被拆分并基于每个单词进行评估时才有效。