以下是几种在PHP中将敏感文字内容替换为星号的常见操作方法:
使用str_replace()
函数
这是最基本的方法,适用于简单的、明确的敏感词替换 。以下是一个示例:
<?php
// 要检查的原始文本
$text = "这个文本包含一些敏感词,比如暴力和色情等。";
// 敏感词数组
$sensitiveWords = array('暴力', '色情');
// 替换敏感词为星号
$replacedText = str_replace($sensitiveWords, str_repeat('*', strlen($sensitiveWords[0])), $text);
echo $replacedText;
?>
在上述代码中,定义了一个包含敏感词的数组 $sensitiveWords
,然后使用 str_replace()
函数将这些敏感词替换为相同长度的星号字符串。str_repeat('*')
函数用于生成一个由星号组成的字符串,其长度与被替换的敏感词相同。
使用preg_replace()
函数配合正则表达式
当敏感词可以出现在文本的任何位置,并且可能有多种变体时,使用正则表达式会更加灵活 。以下是一个示例:
<?php
// 要检查的原始文本
$text = "这个文本包含一些敏感词,比如violence和pornography等。";
// 敏感词数组
$sensitiveWords = array('violence', 'pornography');
// 创建一个正则表达式模式,匹配所有敏感词
$pattern = '/'. implode('|', array_map('preg_quote', $sensitiveWords)). '/i';
// 使用正则表达式替换敏感词为星号
$replacedText = preg_replace($pattern, str_repeat('*', max(array_map('strlen', $sensitiveWords))), $text);
echo $replacedText;
?>
在这个例子中,使用 preg_quote()
函数对敏感词进行转义,以确保它们在正则表达式中被正确处理。implode()
和 array_map()
函数用于创建一个正则表达式模式,它可以匹配数组中的任何敏感词。max()
函数用于确定最长敏感词的长度,以便替换时使用相应数量的星号 。
自定义函数实现特定规则的替换
例如,可以定义一个函数来实现保留字符串的首尾部分,将中间部分替换为星号 。以下是一个示例函数:
<?php
function secret_str($str, $prefix = 4, $suffix = 4, $max_star = 4)
{
if (empty($str) || empty($max_star)) return $str;
$strLen = strlen($str);
if ($prefix > 0 && $strLen <= $prefix) return $str;
if ($suffix > 0 && $strLen <= $suffix) return $str;
if ($strLen <= ($prefix + $suffix)) {
if ($prefix > 0) {
$starNum = $strLen - $prefix;
$star = str_repeat("*", $starNum);
return substr($str, 0, $prefix). $star;
} else {
$starNum = $strLen - $suffix;
$star = str_repeat("*", $starNum);
return $star. substr($str, $starNum);
}
}
if ($prefix > 0) {
$first = substr($str, 0, $prefix);
} else {
$first = "";
}
if ($suffix > 0) {
$end = substr($str, $strLen - $suffix);
} else {
$end = "";
}
$starNum = $strLen - $prefix - $suffix;
$starNum = min($starNum, $max_star);
$middle = str_repeat("*", $starNum);
return $first. $middle. $end;
}
?>
你可以根据具体需求调用这个函数,如 secret_str($str, 2, 2)
来将字符串 $str
的首尾各保留2个字符,中间部分替换为星号。
针对特定类型数据的替换方法
• 手机号码脱敏 :
• 字符串截取法:
<?php
$tel = '13812345678';
$new_tel1 = substr($tel, 0, 3).'****'.substr($tel, 7);
var_dump($new_tel1);
?>
- **替换字符串的子串法**:
<?php
$tel = '13812345678';
$new_tel2 = substr_replace($tel, '****', 3, 4);
var_dump($new_tel2);
?>
- **正则表达式法**:
<?php
$tel = '13812345678';
$new_tel3 = preg_replace('/(\d{3})\d{4}(\d{4})/', '$1****$2', $tel);
var_dump($new_tel3);
?>
以上三种方法都可以将手机号码中间四位替换为星号,输出结果均为 138****5678
。