suin.io

より正確な文字数カウント関数(再考)

suin2006年6月21日

以前、このサイトで「より正確な文字数カウント関数」について採り上げましたが、それについて少し再考してみました。

まず初めにコードから明示しておきます。

<?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を書いたことがある人なら判ると思いますが、ソースに半角スペースをいくら連続して書いても、それはひとつの半角スペースにしかなりません。より現実的な文字カウントをするために、連続した半角スペースはひとつの半角スペースに置換することにしました。

RELATED POSTS