PHP原生不支持语义中文分词,需借助jieba-php等外部库实现;若仅匹配固定词表,可用preg_match_all配合预编译UTF-8正则,注意长词优先与u修饰符。

PHP 原生不支持中文分词,直接用 str_split() 或 explode() 按字切只会得到单字,不是“词”。要按语义分词(比如“北京大学”切为一个词而非“北京”+“大学”),必须借助外部分词库或 API。
用 jieba-php 实现轻量级中文分词
这是目前最接近 Python jieba 的 PHP 移植,支持精确模式、全模式和搜索引擎模式,纯 PHP 实现,无需扩展编译:
- 通过 Composer 安装:
composer require fukuball/jieba-php - 初始化后调用
Jieba::cut()即可分词,返回数组,如['北京', '大学', '是', '一', '所', '高', '校'] - 若需保留词性,用
Jieba::cutForSearch()或配合Jieba::tag()(后者返回带词性的键值对) - 注意:首次加载词典较慢,建议在 CLI 启动时预热,或在 Web 环境中缓存
Jieba实例,避免每次请求重复初始化
绕过分词库:用正则 + 词典做简单关键词提取
如果只需匹配固定词表(如敏感词、产品名、地名),不必上完整分词器,可用 preg_match_all() 配合预编译词典:
- 把词表用
array_map('preg_quote', $words)转义后拼成/($word1|$word2|$word3)/u模式 - 务必加
u修饰符,否则 UTF-8 中文会匹配失败 - 顺序很重要:长词优先(如先“清华大学”,再“清华”),否则“清华”会提前截断“清华大学”
- 性能尚可,但无法处理未登录词(词典外的新词、网络用语、人名等)
慎用 mb_substr() + 字典查表模拟分词
有人尝试用最大匹配法(MM)自己写逻辑:从左到右取最长可能词,查本地词典。这看似可控,实际问题很多:
立即学习“PHP免费学习笔记(深入)”;
- 歧义消解缺失——“结婚的和尚未结婚的”切出来可能是“结婚/的/和/尚未/结婚/的”,而非正确切分
- 词典覆盖率低导致大量单字残留,效果不如
jieba-php - UTF-8 下用
mb_substr($str, $i, 1, 'UTF-8')取字没问题,但逐字拼接子串查词典,时间复杂度 O(n²),长文本卡顿明显 - 简繁体、异体字、标点兼容性需额外处理,容易漏判
真正需要准确分词的场景(搜索、NLP 前处理、内容标签生成),别省那几 MB 内存,老实用 jieba-php;如果只是匹配已知关键词,正则 + 有序词典更稳。别自己重造轮子——中文分词的边界模糊性,远超多数人预估。











