带有 preg_replace_callback 的正则表达式用于脏话过滤器
Regex with preg_replace_callback used for profanity filter
我有一个工作函数,它获取一组坏词,然后用星号替换坏词。
当我升级到 PHP7 时,我不得不使用 preg_replace_callback
,因为 preg_replace
e
修饰符已贬值。
我是这样使用它的:
function filterwords($text){
$filterWords = array("dummy");
$filterCount = sizeof($filterWords);
for($i=0; $i<$filterCount; $i++){
$text = preg_replace('/\b'.$filterWords[$i].'\b/ie',"str_repeat('*',strlen('[=11=]'))",$text);
}
return $text;
}
这是我的新代码:
echo filterwords("I am a dummy");
function filterwords($text){
$filterWords = array("dummy");
$filterCount = sizeof($filterWords);
for($i=0; $i<$filterCount; $i++){
$text = preg_replace_callback('/\b'.$filterWords[$i].'\b/i',
function ($matches) {
return str_repeat('*',strlen('[=12=]'));
},
$text);
}
return $text;
}
这输出 "I am a **" 但我想要的输出是 "I am a *****" (有 5 个星号而不是 2 个) .
preg_replace
中使用的反向引用如 [=12=]
在 preg_replace_callback
中没有任何意义。您将匹配项作为 $matches
传递给函数,但您正在检查 strlen('[=15=]')
这只是一个 2 个字符的字符串 [=12=]
所以您得到 2 *
.
使用$matches
和反向引用的编号。就像你习惯的那样,0
是完全匹配:
return str_repeat('*', strlen($matches[0]));
我有一个工作函数,它获取一组坏词,然后用星号替换坏词。
当我升级到 PHP7 时,我不得不使用 preg_replace_callback
,因为 preg_replace
e
修饰符已贬值。
我是这样使用它的:
function filterwords($text){
$filterWords = array("dummy");
$filterCount = sizeof($filterWords);
for($i=0; $i<$filterCount; $i++){
$text = preg_replace('/\b'.$filterWords[$i].'\b/ie',"str_repeat('*',strlen('[=11=]'))",$text);
}
return $text;
}
这是我的新代码:
echo filterwords("I am a dummy");
function filterwords($text){
$filterWords = array("dummy");
$filterCount = sizeof($filterWords);
for($i=0; $i<$filterCount; $i++){
$text = preg_replace_callback('/\b'.$filterWords[$i].'\b/i',
function ($matches) {
return str_repeat('*',strlen('[=12=]'));
},
$text);
}
return $text;
}
这输出 "I am a **" 但我想要的输出是 "I am a *****" (有 5 个星号而不是 2 个) .
preg_replace
中使用的反向引用如 [=12=]
在 preg_replace_callback
中没有任何意义。您将匹配项作为 $matches
传递给函数,但您正在检查 strlen('[=15=]')
这只是一个 2 个字符的字符串 [=12=]
所以您得到 2 *
.
使用$matches
和反向引用的编号。就像你习惯的那样,0
是完全匹配:
return str_repeat('*', strlen($matches[0]));