str_word_count() 默认自动忽略标点,仅统计含字母、数字、下划线及中间撇号的单词;支持返回数量或数组,可扩展charlist添加连字符,但不支持中文等多字节语言。

str_word_count() 默认就自动忽略标点,只要标点不是字母、数字或下划线,它就不会算进单词里。
比如:
$str = "Hello, world! How's it going? (Very well.)"; echo str_word_count($str); // 输出:7
它识别出的单词是:Hello、world、How's、it、going、Very、well
注意:撇号 ' 在中间(如 How's)被保留,因为 str_word_count() 允许单词中含 '(但不能开头);而逗号、感叹号、括号、问号等全被跳过。
✅ 正确用法:直接调用,无需额外处理
-
统计数量(最常用):
$count = str_word_count($str); // 自动过滤标点,只数有效单词
-
获取单词数组(方便后续处理):
立即学习“PHP免费学习笔记(深入)”;
$words = str_word_count($str, 1); // 返回 ['Hello', 'world', "How's", 'it', 'going', 'Very', 'well']
-
需要保留连字符或自定义符号?加
charlist参数:// 把连字符 `-` 和撇号 `'` 当作单词一部分(默认已支持 `'`,但 `-` 需显式添加) $words = str_word_count("e-mail isn't broken", 1, "-'"); // 结果:['e-mail', "isn't", 'broken']
⚠️ 注意事项
-
str_word_count()不支持多字节语言(如中文、阿拉伯文、日文),对这些语言会返回空或错误结果。 - 它依赖 C 库的 locale 设置,但 PHP 默认 locale 通常是
C,所以实际只认 ASCII 字母(a–z)、数字、'、-(且-必须在中间)。 - 连续标点或空格不影响计数,函数内部已做清理。
❌ 不要这样做(常见误区)
- 不要用
preg_replace先删标点再str_word_count—— 多余,它本来就不理标点。 - 不要用
explode(' ', $str)替代 —— 会把"don't"拆成don和t,丢失语义。 - 不要传入中文字符串指望它分词 —— 它根本不会识别汉字为“词”。
本质上,str_word_count() 对英文就是开箱即用的标点无感统计工具。



















