PHP实现DFA算法,查找关键词

# 添加关键词 到全局字典dict里面
protected function addWord($strWord)
{
        $len = mb_strlen($strWord,'UTF-8');
        $curNode = &$this->dict;
        for ($index = 0; $index < $len; $index++) {
            $word = mb_substr($strWord, $index, 1, 'UTF-8');
            if (!isset($curNode[$word])) {
                $curNode[$word] = [];
            }
            $curNode =& $curNode[$word];
        }
        $curNode['end'] = 1;
}
# 根据字典dict搜索关键词

public function searchMatchWords($strWords)
{
        $len = mb_strlen($strWords, 'UTF-8');
        $result = [];
        for ($index = 0; $index < $len; $index++) {
            $wordLength = $this->searchWord($strWords, $index);
            if ($wordLength > 0) {
                $words = mb_substr($strWords, $index, $wordLength, 'UTF-8');
                if (!isset($result[$words])) {
                    $result[$words] = 1;
                } else {
                    $result[$words] = $result[$words]++;
                }
                $index += $wordLength - 1;
            }
        }
        return $result;
}

protected function searchWord($strWords, $beginIndex)
{
       $len = mb_strlen($strWords, 'UTF-8');
        $curNode = $this->dict;
        $isEnd = false;
        $wordLength = 0;
        for ($index = $beginIndex; $index < $len; $index++) {
            $word = mb_substr($strWords, $index, 1, 'UTF-8');
            if (!isset($curNode[$word])) {
                break;
            }
            $wordLength++;
            $curNode = $curNode[$word];
            if (isset($curNode['end'])) {
                $isEnd = true;
            }
        }
        if (!$isEnd) {
            $wordLength = 0;
        }
        return $wordLength;
}

参考文档

DFA算法匹配关键词 - 简书

你可能感兴趣的:(php,DFA算法)