对中文,日文及韩文等亚洲的语言进行字数统计,一般是按照字符的数量来计算;而对于英文等西方语言,则是按照单词(words)数量来计算,而不是字符(characters)。.
PHP提供了一些函数,例如 strlen()
和用于包含多字节字符(例如UTF-8对ASCII的补集)的字符串的 mb_strlen()
等,但它们都是基于字符数量进行统计——即无法正确处理英文单词数量。
PHP还提供了 str_word_count()
,它可以正确地处理英文单词,但无法正确地处理亚洲的语言。
例如:
mb_strlen() 的输出 |
str_word_count() 的输出 |
正确的字数 | |
你好世界! |
5 | 0 | 5 |
Hello World! |
12 | 2 | 2 |
你好,我是Leo |
8 | 1 | 6 |
解决方案
既然每个英文单词应该使总字数增加 1
,可以考虑设法将其替换为单个字母,完成上述步骤后,移除特殊符号及空格等不应被计入字数的字符再用 mb_strlen()
字数统计即可。
function countWords (string $content):int {
// 将换行符替换为空格
$content = str_replace(["\r", "\n", "\t"], " ", $content);
// 将连续的英文和数字替换为单个字母
$content = preg_replace('/[a-zA-Z0-9]+/', 'A', $content);
// 移除特殊符号
$content = str_replace([
'`', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')',
'-', '_', '=', '+', '[', ']', '{', '}', '|', '\\', ';', ':',
'\'', '"', ',', '.', '<', '>', '/', '?'
], '', $content);
// 移除空格
$content = str_replace(' ', '', $content);
// 统计字数
return mb_strlen($content);
}