使用PHP对包含中文和英文的字符串进行字数统计

对中文,日文及韩文等亚洲的语言进行字数统计,一般是按照字符的数量来计算;而对于英文等西方语言,则是按照单词(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);
}