php实现简单的基于DFA算法的敏感词过滤

本文介绍如何使用PHP实现基于DFA算法的敏感词过滤功能,并提供了完整的代码示例。该方法支持最大匹配原则,适用于网站内容审核等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一个学Go语言朋友,给我发了一篇文章http://blog.youkuaiyun.com/chenssy/article/details/26961957,讲的是使用DFA(即Deterministic Finite Automaton,有穷自动机)算法实现敏感词的过滤。问我能不能使用php来实现,感谢chenssy的精彩文章,下面是我仿照版本的php实现。

2018-05-11新增:
这个做了增强版—增强版GitHub源码

<?php

header("Content-type:text/html; charset=utf-8");

class MyMap
{
    public function get($key)
    {
        return isset($this->$key) ? $this->$key : null;
    }

    public function put($key, $value)
    {
        $this->$key = $value;
    }
}

class MyFilter
{
    public $map = null;

    public function addWordToMap($word)
    {
        $len = mb_strlen($word);
        if (is_null($this->map)) {
            $map = new MyMap();
            $map->put('isEnd', 0);
        } else {
            $map = $this->map;
        }
        $tmp = $map;

        for ($i = 0; $i < $len; $i++) {
            $nowWord = mb_substr($word, $i, 1);

            $nowMap = $map->get($nowWord);

            if (!is_null($nowMap)) {
                $map = $nowMap;
            } else {
                $newMap = new MyMap();
                $newMap->put('isEnd', 0);
                $map->put($nowWord, $newMap);
                $map = $newMap;
            }

            if ($i == ($len - 1)) {
                $map->put('isEnd', 1);
            }
        }
        $this->map = $tmp;
    }

    //仅支持最大匹配
    public function searchFromMap($string)
    {
        $len = mb_strlen($string);
        $tmp = $this->map;
        $map = $this->map;
        $str = '';
        $result = [];
        for ($i = 0; $i < $len; $i++) {
            $nowWord = mb_substr($string, $i, 1);
            $nowMap = $map->get($nowWord);

            if (!is_null($nowMap)) {
                $str .= $nowWord;
                if ($nowMap->get('isEnd')) {
                    array_push($result, $str);
                    $str = '';
                    $map = $tmp;
                } else {
                    $map = $nowMap;
                }
            } else {
                if (!empty($str)) {
                    $i--;
                }   
                $str = '';
                $map = $tmp;
            }
        }
        return $result;
    }
}

$example = new MyFilter();

$example->addWordToMap('中国人');
$example->addWordToMap('中国男人');
$example->addWordToMap('女人');


$result = $example->searchFromMap('我是中国人,我爱中国,中国男人是最优秀的,中国女人是最漂亮的');
//var_dump($example->map);
var_dump($result);

个人博客地址
github源码地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值