PHP中文关键词匹配实例代码

关键词匹配是比较常见的需求,如留言、弹幕及游戏聊天中的敏感词过滤,都需要对一段文字进行关键词匹配。提取到关键词后,再做进一步处理。 本类借助PHP高效的数组和mbstring扩展,来实现对中文关键词的匹配。主要思想是以关键词为key,构建字典数组,这样便
关键词匹配是比较常见的需求,如留言、弹幕及游戏聊天中的敏感词过滤,都需要对一段文字进行关键词匹配。提取到关键词后,再做进一步处理。
本类借助PHP高效的数组和mbstring扩展,来实现对中文关键词的匹配。主要思想是以关键词为key,构建字典数组,这样便可以对每个关键词可实现常数级别的查找。
具体代码如下:
class WordMatcher {
    public $dict = [];
    public $wordMaxLen = 0;

    function __construct(){
        if(! extension_loaded('mbstring')) {
            exit('extension mbstring is not loaded');
        }
    }

    function addWord($word) {
        $len = mb_strlen($word, 'utf-8');
        $this->wordMaxLen = $len > $this->wordMaxLen ? $len : $this->wordMaxLen;
        $this->dict[$word] = 1;
    }

    function removeWord($word) {
        unset($this->dict[$word]);
    }

    function match($str, &$matched, $matchAll=false) {
        if(mb_strlen($str) < 1) {
            return;
        }

        $matchLen = 0;
        $len = $this->wordMaxLen;
        while($len>0) {
            $substr = mb_substr($str, 0, $len, 'utf-8');
            if(isset($this->dict[$substr])) {
                $matchLen = $len;
                $matched[] = $substr;
                break;
            } else {
                $len--;
            }
        }

        if(!$matchAll && $matchLen) {
            $str = mb_substr($str, $matchLen, null, 'utf-8');
        } else {
            $str = mb_substr($str, 1, null, 'utf-8');
        }

        $this->match($str, $matched, $matchAll);
    }
}

$matcher = new WordMatcher;
$matcher->addWord('PHP');
$matcher->addWord('语言');
$matcher->addWord('H');
$matcher->match('PHP是最好的语言', $matched);
 
本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

php数据处理:数组根据某字段进行分组,实例代码如下: /** * @description:根据数据 * @param {dataArr:需要分组的数据;keyStr:分组依据} * @return: */ protected function dataGroup(array $dataArr,string $keyStr) :array { $newArr=[]; foreach ($data
$base64为图片的编码字符串 preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64, $result);$type = $result[2]; //获取图片的类型jpg png等$name = ”xxxx".".$type; //图片重命名$savepath = ‘C:/'.$name; //图片保存目录file_put_contents($savepat
文件发送的代码如下: ?$url = 'http://127.0.0.1/fujian/jieshou.php'; // 目标URL$filePath2 = iconv("utf-8","gb2312",'D:/MYOA/webroot/fujian/1/副本.txt'); // 文件路$filePath1 = iconv("utf-8","gb2312",'D:/MYOA/webroot/fujian/1/1.txt'); // 文件
PHP支持许多的函数,其中一些函数完全可以将字符串,制作为图片,将画布背景放上一些乱码,再挑选四个数字(你也可以添加字母,但是那样会比较花)。按照不同的角度放在画布上。具体代码如下: ?php//设置字符集header("Content-Type:text/html;charset=utf-8
php获取数组中某一个元素的值,并用逗号分隔 //打印方法function pp($ay){echo "pre";print_r($ay);}//定义数组$user_list=array('0'=['id'=1,'name'='刘德华'],'1'=['id'=2,'name'='张学友'],'2'=['id'=3,'name'='黎明'],'3'=['id'=4,'name'='郭富城']);pp(
serialize():将对象转化为字符串保存、unserialize():将字符串反转为对象(对应的类也必须包含) serialize -- 产生一个可存储的值的表示;返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方 /* 串行化(序列化) */class Person { public $nam