PHP敏感词汇屏蔽或替换

在开发过程中,很多地方需要屏蔽掉一些敏感的词汇,或者将敏感词汇替换成其他字符,下面就是一个封装好的屏蔽敏感词汇的类

<?php
namespace app\models;
class SensitiveWordFilter
{
private $dict;
private $dictPath;

public function __construct($dictPath)
{
$this->dict = array();
$this->dictPath = $dictPath;//敏感词汇库文件(就是敏感词组成的文本文件,每个词一个换行)
$this->initDict();
}

private function initDict()
{
$handle = fopen($this->dictPath, 'r');
if (!$handle) {
throw new \RuntimeException('open dictionary file error.');
}

while (!feof($handle)) {
$word = trim(fgets($handle, 128));

if (empty($word)) {
continue;
}

$uWord = $this->unicodeSplit($word);

$pdict = &$this->dict;

$count = count($uWord);
for ($i = 0; $i < $count; $i++) {
if (!isset($pdict[$uWord[$i]])) {
$pdict[$uWord[$i]] = array();
}
$pdict = &$pdict[$uWord[$i]];
}

$pdict['end'] = true;
}

fclose($handle);
}

public function filter($str, $maxDistance = 5)
{
if ($maxDistance < 1) {
$maxDistance = 1;
}

$uStr = $this->unicodeSplit($str);

$count = count($uStr);

for ($i = 0; $i < $count; $i++) {
if (isset($this->dict[$uStr[$i]])) {
$pdict = &$this->dict[$uStr[$i]];

$matchIndexes = array();

for ($j = $i + 1, $d = 0; $d < $maxDistance && $j < $count; $j++, $d++) {
if (isset($pdict[$uStr[$j]])) {
$matchIndexes[] = $j;
$pdict = &$pdict[$uStr[$j]];
$d = -1;
}
}

if (isset($pdict['end'])) {
return 'mingan';
//这里是检测出有敏感词汇直接返回,下方注释是把敏感词汇替换成“萌字”
// $uStr[$i] = '萌';
// foreach ($matchIndexes as $k) {
// if ($k - $i == 1) {
// $i = $k;
// }
// $uStr[$k] = '萌';
// }
}
}
}

return implode($uStr);
}

public function unicodeSplit($str)
{
$str = strtolower($str);
$ret = array();
$len = strlen($str);
for ($i = 0; $i < $len; $i++) {
$c = ord($str[$i]);

if ($c & 0x80) {
if (($c & 0xf8) == 0xf0 && $len - $i >= 4) {
if ((ord($str[$i + 1]) & 0xc0) == 0x80 && (ord($str[$i + 2]) & 0xc0) == 0x80 && (ord($str[$i + 3]) & 0xc0) == 0x80) {
$uc = substr($str, $i, 4);
$ret[] = $uc;
$i += 3;
}
} else if (($c & 0xf0) == 0xe0 && $len - $i >= 3) {
if ((ord($str[$i + 1]) & 0xc0) == 0x80 && (ord($str[$i + 2]) & 0xc0) == 0x80) {
$uc = substr($str, $i, 3);
$ret[] = $uc;
$i += 2;
}
} else if (($c & 0xe0) == 0xc0 && $len - $i >= 2) {
if ((ord($str[$i + 1]) & 0xc0) == 0x80) {
$uc = substr($str, $i, 2);
$ret[] = $uc;
$i += 1;
}
}
} else {
$ret[] = $str[$i];
}
}

return $ret;
}
}

调用

$filter = new SensitiveWordFilter(__DIR__.'/mg.txt');
$check = $filter->filter($groupname,2);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,638评论 25 708
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • 和你一起终身学习,这里是罗辑思维。 今天的“罗胖精选”,来自「得到」的付费专栏《关系攻略》。跟你聊聊,如何在职场中...
    AmuseDou阅读 301评论 0 0
  • 项目背景: 通过研究试客小兵/钱咖 此类试玩平台,可以确定的是应用使用了苹果没有正式公开的私有API(此类API主...
    王宪岭阅读 1,805评论 0 4