PHP方法:
if (!function_exists('get_count_str')) {
/**
* word字数计算法
* @param $str
* @param bool $trimHTml
* @return int|mixed|string
*/
function get_count_str($str,$trimHTml = TRUE)
{
if (true === $trimHTml) {
$str = preg_replace("/(\s|\ \;| |\xc2\xa0)/", " ", strip_tags($str));
}
$pattern = "/[^";
$pattern .= "\x{4e00}-\x{9fa5}";//中文
$pattern .= "\x{3002}";//句号:。
$pattern .= "\x{FF1F}";//问号:?
$pattern .= "\x{FF01}";//叹号:!
$pattern .= "\x{FF0C}";//逗号:,
$pattern .= "\x{3001}";//顿号:、
$pattern .= "\x{FF1B}";//分号:;
$pattern .= "\x{FF1A}";//冒号::
$pattern .= "\x{300C}";//引号:「
$pattern .= "\x{300D}";//引号:」
$pattern .= "\x{300E}";//引号:『
$pattern .= "\x{300F}";//引号:』
$pattern .= "\x{2018}";//引号:‘
$pattern .= "\x{2019}";//引号:’
$pattern .= "\x{201C}";//引号:“
$pattern .= "\x{201D}";//引号:”
$pattern .= "\x{FF08}";//括号:(
$pattern .= "\x{FF09}";//括号:)
$pattern .= "\x{3014}";//括号:〔
$pattern .= "\x{3015}";//括号:〕
$pattern .= "\x{3010}";//括号:【
$pattern .= "\x{3011}";//括号:】
$pattern .= "\x{2014}";//破折号:—
$pattern .= "\x{2026}";//省略号:…
$pattern .= "\x{2013}";//连接号:–
$pattern .= "\x{FF0E}";//连接号:.
$pattern .= "\x{300A}";//书名号:《
$pattern .= "\x{300B}";//书名号:》
$pattern .= "\x{3008}";//书名号:〈
$pattern .= "\x{3009}";//书名号:〉
//基本拉丁字母 https://unicode-table.com/cn/blocks/basic-latin/
//$pattern .= "\x{0020}-\x{002F}";//以下是详细 但是好像word里面不计数
$pattern .= "\x{0020}";//空格:
$pattern .= "\x{0021}";//感叹号:!
$pattern .= "\x{0022}";//双引号:"
$pattern .= "\x{0023}";//#号:#
$pattern .= "\x{0024}";//美元:$
$pattern .= "\x{0025}";//百分号:%
$pattern .= "\x{0026}";//与:&
$pattern .= "\x{0027}";//单引号:'
$pattern .= "\x{0028}";//括号:(
$pattern .= "\x{0029}";//括号:)
$pattern .= "\x{002A}";//星号:*
$pattern .= "\x{002B}";//加号:+
$pattern .= "\x{002C}";//逗号:,
$pattern .= "\x{002D}";//负号:-
$pattern .= "\x{002E}";//句号:.
$pattern .= "\x{002F}";//斜线号:/
//数字
$pattern .= "\x{0030}-\x{0039}";//0~9
//ASCII標點和符號
$pattern .= "\x{003A}-\x{0040}";//
$pattern .= "\x{005B}-\x{0060}";//
$pattern .= "\x{007B}-\x{007E}";//
$pattern .= "\x{002F}";//控製字符:del 删除
$pattern .= "]+/u";
$l = preg_replace($pattern, '', $str);
$n = mb_strlen($l, 'UTF-8');//中文字符
$j = str_word_count($str);//英文单词数
$n += $j;//中文加上英文
return $n;
}
}
新修复了一些bug: 以下是最新版本:
以下的代码,是新搞出来的,经过测试,和 word 统计出来的一致,也没有上面的问题了,但是这里有个特殊字符的问题,我这里只是列出了一部分的半角状态下的特殊字符
/**
* word字数计算法
* @param string $str
* @param string $replace 需要替换的字符
* @param bool $trimHTml
* @return int|mixed|string
*/
function get_count_str($str,$replace = "龘",$trimHTml = TRUE)
{
if (true === $trimHTml) {
$str = preg_replace("/(\s|\ \;| |\xc2\xa0)/", " ", strip_tags($str));
}
//判断是否存在替换字符
$is_replace_count = substr_count($str, $replace);
try {
//先将回车换行符做特殊处理
$str = preg_replace('/(\r\n+|\s+| +)/', $replace, $str);
//处理英文字符数字,连续字母、数字、英文符号视为一个单词
$str = preg_replace('/[a-z_A-Z0-9-\.!@#\$%\\\^&\*\)\(\+=\{\}\[\]\/",\'<>~`\?:;|]/', "m", $str);
//合并字符m,连续字母、数字、英文符号视为一个单词
$str = preg_replace('/m+/', "*", $str);
//去掉回车换行符
$str = preg_replace('/' . $replace . '+/', "", $str);
//返回字数
return mb_strlen($str) + $is_replace_count;
} catch (Exception $e) {
return 0;
}
}
我再来个 js 版本的,经过测试,和 word 统计出来的一致
function fnGetCpmisWords(str){
var sLen = 0;
try{
//先将回车换行符做特殊处理
str = str.replace(/(\r\n+|\s+| +)/g,"龘");
//处理英文字符数字,连续字母、数字、英文符号视为一个单词
str = str.replace(/[\x00-\xff]/g,"m");
//合并字符m,连续字母、数字、英文符号视为一个单词
str = str.replace(/m+/g,"*");
//去掉回车换行符
str = str.replace(/龘+/g,"");
//返回字数
sLen = str.length;
}catch(e){
}
return sLen;
}
以下也可:
(function (w) {
var pregCh = /[^\n\u180E\u200B\u200C\u200D\u2028-\u2029\uFEFF]/g,
pregSpace = /[^ \t\u00a0\u3000]/g,
pregCn = /[\u2E80-\u2FDF\u3040-\u318F\u31A0-\u31FF\u3400-\u4DBF\u4E00-\uA4CF\uA500-\uA63F\uAC00-\uD7AF\uF900-\uFAFF。?!,、;:「」﹁﹂『』()-~《》〈〉﹏_【】〖〗〔〕{}[]]/g,
pregWord = /[^0-9A-Za-z\u00C0-\u02AF\u0370-\u10FF\u1100-\u11FF\u1200-\u180D\u180F-\u1FFF\u2C00-\u2DFF\uA4D0-\uA4FF\uA640-\uA970\uA980-\uABFF\uFB00-\uFDFF\uFE70-\uFEDD\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A.?!,:…‘’"'“”;()\[\]{}⟩⟨«»%#$^&*-\-‐‒\/~_\\]+/;
function getStr(str) {
return "string" === typeof str && str ? str : "";
}
function matchStr(str, preg) {
preg = preg && [preg] || [];
return str.match.apply(str, preg) || [];
}
w.countChars = function (str) {
return matchStr(getStr(str), pregCh).length;
};
w.countCharsWithoutSpaces = function (str) {
return matchStr(matchStr(getStr(str), pregCh).join(""), pregSpace).length
};
w.countWords = function (str) {
str = getStr(str);
return matchStr(str, pregCn).length + str.split(pregWord).filter(function (c) {
return !!c;
}).length;
};
}
)(window)