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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值