str_word_count()用于统计英文单词数,返回整数表示单词总数,支持数组模式和自定义字母字符;对中文无效,需结合trim()、正则清理及字数统计。

PHP 用 str_word_count() 统计单词数而非字节数
PHP 默认的 strlen() 和 mb_strlen() 算的是字节或字符长度,不是“单词数”。要按英文单词个数判断字符串长度(比如限制用户输入最多 10 个单词),必须用 str_word_count()。
它默认以空白、标点(如 .、,、!)为分隔符,只提取字母数字组合的“词”,忽略纯符号和空格:
echo str_word_count("Hello, world! How are you?"); // 输出:5
- 返回整数:单词总数(最常用模式)
- 支持第二个参数:
0(返回数量)、1(返回单词数组)、2(返回 [位置 => 单词] 关联数组) - 第三个参数可指定额外“视为字母”的字符,比如支持带连字符的词:
str_word_count("e-mail well-known", 0, '-')
中文字符串不能直接用 str_word_count()
str_word_count() 是为拉丁语系设计的,对中文、日文等无空格分词的语言完全无效——它会把整个中文字符串当作 0 个单词(因为没找到符合“字母+数字”规则的单元):
var_dump(str_word_count("你好世界")); // int(0)
如果业务场景混有中英文(如用户昵称“Tom_小明”),需先用正则或 preg_match_all() 提取英文单词再计数,中文部分建议改用字数(mb_strlen($s, 'UTF-8'))或自定义分词逻辑(如调用第三方 SDK),不要强行套用单词数逻辑。
立即学习“PHP免费学习笔记(深入)”;
验证输入时别漏掉 trim() 和非打印字符
用户粘贴内容常带首尾空格、制表符甚至零宽空格(\u200b),这些会导致 str_word_count() 返回异常结果(比如空字符串返回 0,但带空格的字符串可能返回 0 或 1,取决于空格位置):
- 始终先
trim()再统计:str_word_count(trim($input)) - 警惕不可见字符:用
preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $input)清理控制字符 - 避免用
empty()判断单词数是否为 0 —— 它无法区分“纯空格”和“真无词”,应显式比较:str_word_count(trim($input)) === 0
性能注意:大文本下 str_word_count() 比 explode(' ', ...) 更可靠但稍慢
有人想用 count(explode(' ', $s)) 快速替代,但这是错的:它按空格硬切,无法处理多个空格、换行、标点后无空格等情况(例如 "a,b c" 会被算成 2 词,实际应为 3)。
str_word_count() 内部是状态机扫描,准确但比简单 explode 多 20%–30% 开销。对单次请求影响微乎其微;若需高频处理万级单词文本(如日志分析),可考虑缓存结果或改用 mb_split() 配合正则,但绝大多数表单校验场景无需优化。
真正容易被忽略的是:它不处理 Unicode 标点的边界情况(比如某些 emoji 后紧跟字母可能被误吞),生产环境若涉及国际化输入,建议加一层白名单校验或降级为字符长度兜底。











