0

我有一系列单词

$banned_names = array('about','access','account');

实际数组很长 a 包含坏词,因此有可能违反任何规则我刚刚添加了一个示例,我遇到的问题如下:

$title = str_ireplace($filterWords, '****', $dn1['title']);

但是,这可行,我过滤的单词之一是“朗姆酒”,如果我要发布“论坛”这个词,它将显示为“fo****”

所以我只需要替换这个词,****如果它与数组中的确切词匹配,如果我要举一个例子,短语“让我们检查论坛看看是否有人有朗姆酒”,将是“让我们检查论坛看看如果有人有****”。

4

3 回答 3

3

您可以使用正则表达式\W来匹配“非单词”字符:

var_dump(preg_match('/\Wrum\W/i', 'the forum thing')); // returns 0 i.e. doesn't match
var_dump(preg_match('/\Wrum\W/i', 'the rum thing'));   // returns 1 i.e. matches

preg_replace()方法采用一系列过滤器str_replace(),但您必须调整列表以包括模式分隔符和\W两侧的。您可以将完整模式静态存储在列表中:

$banlist = ['/\Wabout\W/i','/\Waccess\W/i', ... ];
preg_replace($banlist, '****', $text);

或者动态调整数组以添加这些位。

于 2019-09-16T21:22:10.317 回答
2

与其他答案类似,但这\b在正则表达式中用于匹配单词边界(整个单词)。它还在传递给preg_replace_callback().

$dn1['title'] = 'access forum'; 

$banned_names = array('about','access','account','rum');
$banned_list = array_map(function($r) { return '/\b' . preg_quote($r, '/') . '\b/'; }, $banned_names); 

$title = preg_replace_callback($banned_list, function($m) { 
   return $m[0][0].str_repeat('*', strlen($m[0])-1);
}, $dn1['title']);

echo $title; //a***** forum
于 2019-09-16T21:35:31.927 回答
1

在将 haystack 中的每个字符串转换为字符串数组后,您可以使用preg_replace()字符串标记的开头/结尾来查找针,这样您就可以匹配完整的单词。或者,您可以添加空格并继续使用 str_ireplace() 但如果您的单词是正在检查的字符串中的第一个或最后一个单词,该选项将失败。

添加空格(会错过第一个/最后一个单词,不推荐):

当然,您必须首先修改您的过滤数组。是的,foreach 可以更简单,但我希望这能说明我在做什么/为什么。

foreach($filterWords as $key => $value){
    $filterWords[$key] = " ".$value." ";
}
str_ireplace ( $filterWords, "****", $dn1['title'] );

或分解长字符串(推荐):

foreach($filterWords as $key => $value){
    $filterWords[$key] = "/^".$value."$/i"; //add regex for beginning/end of string value
}
preg_replace ( $filterWords, "****", explode(" ", $dn1['title']) );
于 2019-09-16T21:26:51.460 回答