以前、このサイトで「より正確な文字数カウント関数」について採り上げましたが、それについて少し再考してみました。
まず初めにコードから明示しておきます。
<?php
/* $strはHTMLソースです */
function myStrlen($str){
// HTMLタグを削除
$str = strip_tags($str);
// 改行を削除
$str = preg_replace("/(\015\012)|(\015)|(\012)/", "", $str);
// 連続する半角スペースを半角スペース1としてカウント
$str = preg_replace('!\s+!', " ", $str);
// HTML特殊文字を半角1文字としてカウント
$str = preg_replace("/&[a-zA-Z]{1,5};/", " ", $str);
// Unicode10進文字を半角1文字としてカウント
$str = preg_replace("/&#[0-9]{1,5};/", " ", $str);
// PHPマルチバイト対応
if( function_exists('mb_strlen') ){
$result = mb_strlen($str);
}else{
$result = strlen($str);
}
return $result;
}
以前のコードと比較して、追加された処理があります。それは改行文字を取り除く処理と連続した半角スペースをひとつの半角スペースとみなす処理です。
PHPのstrlen()やmb_strlen()は¥nなどのメタ文字も1文字としてカウントします。しかし、人間が実際見たとき、改行を1文字として認識するでしょうか?人間の「文字」の概念には改行というものはないでしょう。そこで、今回は改行をカウントしないような処理を加えたのです。
また連続した半角スペースをひとつの半角スペースとしてみなす処理は、文字列がHTML文書のときにこそ意味を発揮します。HTMLを書いたことがある人なら判ると思いますが、ソースに半角スペースをいくら連続して書いても、それはひとつの半角スペースにしかなりません。より現実的な文字カウントをするために、連続した半角スペースはひとつの半角スペースに置換することにしました。
トラバURL : http://suin.asia/trackback/275
氷川 XOOPS Module 開発室