WordPress站長們,快給你的文章加上文字統計吧
編輯:狂族晨曦 來源:WordPress技巧 日期:2016-04-20 閱讀: 3,661 次 4 條評論 » 百度已收錄
先森閑著沒事就愛逛逛張戈博客等WordPress大神們的博客,發現大神們的文章頁面中,很多都加上了文字字數統計。不怎么起眼,但看到了會感覺很貼心。
百度了一下,發現代碼基本上是來自知更鳥博客的,鳥叔確實厲害啊。先森體驗了一把,代碼部署起來非常簡單,先將下面的代碼放到functions.php里:
//字數統計
function count_words ($text) {
global $post;
if ( '' == $text ) {
$text = $post->post_content;
if (mb_strlen($output, 'UTF-8') < mb_strlen($text, 'UTF-8')) $output .= '本文共' . mb_strlen(preg_replace('/\s/','',html_entity_decode(strip_tags($post->post_content))),'UTF-8') . '個字';
return $output;}
}
然后在single.php中或其它希望顯示字數統計的位置加上:
<?php echo count_words ($text); ?>
但是鳥叔也說了,中文統計沒有什么問題,但英文統計的是字母。
英文按字母統計,也就意味著一個字母統計就會+1。而我們WordPress最多接觸的就是代碼,代碼的字母動輒就是成百上千。一篇文章看著沒有多少內容,字數統計卻會顯示幾千字,看著著實有點不爽。
先森想要的效果是,中文按字數統計,英文按單詞統計。先森特意看了下Word,發現Word就是這種統計規則。
但是令先森無奈的是,在各大搜索引擎搜了一遍,沒有找到能夠解決這個問題的教程。鳥叔雖然也分享了統計英文博客文字的代碼,但是經先森測試,好像不會對本站的代碼部分進行統計,總之就是統計出來的英文字數不對。想要中文代碼統計文字時排除字母,再加上英文單詞統計的想法破滅了~請看下面內容↓
不過先森在搜索的時候,另外發現了我愛水煮魚關于如何統計中文字數研究的文章。文章介紹了PHP中,計算字符串長度的三種函數strlen,mb_strlen,mb_strwidth。水煮魚用這三個函數去測試統計字符串的長度,看看它們分別把中文算成幾個字節:
echo strlen("你好ABC") . "";
// 輸出 9
echo mb_strlen("你好ABC", 'UTF-8') . "";
// 輸出 5
echo mb_strwidth("你好ABC") . "";
// 輸出 7
上面的測試顯示:strlen 把中文字符算成 3 個字節,mb_strlen 不管中文還是英文,都算 1 個字節,而mb_strwidth 則把中文算成 2 個字節。而實際上,mb_strwidth 才是正確的:中文 2 個字節,英文 1 個字節。
現在再返回去看鳥叔提供的代碼,統計的函數用的是第二種:mb_strlen。通過三種函數統計結果對比可知,這個函數是統計出來數字最少的一種。所以,在找到解決方法之前,鳥叔提供的代碼已經是最好的解決方案了,將就著用吧。
先森之前一直搜索的是WordPress的方法,但后來通過搜索PHP的方法,找到了一些解決方案。
方案一:php 統計字數(支持中英文)的實現代碼
首先還是在functions.php中添加下面代碼;
//php 統計字數(支持中英文)的實現代碼
function count_word($str){
$str = preg_replace('/[\x80-\xff]{1,3}/', ' ', $str,-1,$n);
$n += str_word_count($str);
return $n;
}
然后在希望顯示字數統計的位置加上:
<?php echo ";本文共".count_word($post->post_content)."個字";?>
方案二:PHP統計中英文單詞數(UTF-8編碼)
注:這種方案不會統計標點符號。其實還有一種GB2312編碼的方法,但據說無法統計中文,所以此處沒提。
一樣的,在functions.php中添加下面代碼;
//PHP統計中英文單詞數(UTF-8編碼)
define( "UTF8_CHINESE_PATTERN", "/[\x{4e00}-\x{9fff}\x{f900}-\x{faff}]/u" );
define( "UTF8_SYMBOL_PATTERN", "/[\x{ff00}-\x{ffef}\x{2000}-\x{206F}]/u" );
// count only chinese words
function str_utf8_chinese_word_count($str = ""){
$str = preg_replace(UTF8_SYMBOL_PATTERN, "", $str);
return preg_match_all(UTF8_CHINESE_PATTERN, $str, $arr);
}
// count both chinese and english
function str_utf8_mix_word_count($str = ""){
$str = preg_replace(UTF8_SYMBOL_PATTERN, "", $str);
return str_utf8_chinese_word_count($str) + str_word_count(preg_replace(UTF8_CHINESE_PATTERN, "", $str));
}
也是一樣的,在希望顯示字數統計的位置加上:
<?php echo ";本文共".str_utf8_mix_word_count($post->post_content)."個字";?>
先森在測試的時候,發現不含代碼,文字較多的文章,這兩種方案統計除出來的數字會比鳥叔代碼統計出來的多。下圖中,第一個是鳥叔代碼統計出的,第二個是方案一統計出的,第三個是方案二統計出的。可以看到,方案一和方案二都比鳥叔的多,方案一又比方案二多。為什么會比鳥叔代碼統計的多先森沒懂,但是方案一又比方案二多確實符合了方案二不統計標點符號的特性。

純文字文章三種代碼文字統計情況
而在存在代碼的文章中,后面的兩種方案統計出來的數字又會比鳥叔的小很多。

存在代碼文章三種代碼文字統計情況
總結
本文共分享了三種統計代碼,要使用哪一種就根據各位自己的喜好來了。
正是因為先森沒有搞明白方案一、二兩種統計方式上面的那種情況到底是怎么回事,所以先森用的還是鳥叔的代碼。
若有更合適的代碼,還請網友告知。
轉載請注明出處來自http://www.cnidcc.cn/wpzcm_kgndwzjswztjb.html

川公網安備 51011202000104號
鳥叔。。哈哈!!人家有那么老嗎?
@小C博客: 念著順口了,就這么叫了
鳥叔,水叔,張叔,都是叔叔。
三種代碼適合的人群不同吧,鳥大的適合那種不寫代碼的,,,