匹配和加密单词中的几个字符


Match and Encrypt Few Chars in Word

我正在开发一个筛选逻辑,其中完整的内容文本通过正则表达式与php中的关键字列表相匹配。我正在使用以下代码,它可以正确匹配单词并使其加粗。

$pattern = "/mango|apple|banana/";
$text = "i like banana and apple alot";
$replacement = "<strong>$0</strong>";
echo preg_replace($pattern, $replacement, $text);

此代码正确匹配并使匹配的单词括在强喜欢中

i like <strong>banana</strong> and <strong>apple</strong> alot.

但我想把香蕉换成

b****a and apple as a****e 

而不是让它变得大胆。

谁能帮我怎么可能。

您可以尝试使用 preg_replace_callback 而不是 preg_replace

preg_replace_callback($pattern, function($matches){
    $str = $matches[0];
    $len = strlen($str);
    $stars = str_repeat('*', $len-2);
    return $str[0].$stars.$str[$len-1];
}, $text);

更新以创建动态数量的星星

如果你的模式是固定的,你可能希望像这样将数组传递给preg_replace

$patterns = array(
    '/mango/',
    '/apple/',
    '/banana/'
}
$replacements = array(
    'm***o',
    'a***e',
    'b****a'
)
echo preg_replace($patterns, $replacements, $text);

这也适用于您要替换的任何给定关键字数组,如下所示:

$keywords; // array populated with key words
$patterns = array();
$replacements = array();
array_walk($keywords, function($value, $key) {
    $patterns[] = '/' . $value . '/';
    $replacements[] = strpad($value[0], strlen($value) - 1, '*') . $value[strlen($value) - 1];
}
echo preg_replace($patterns, $replacements, $text);