Pages

2009年9月4日金曜日

Smarty バイトで文字数指定する場合にエスケープもする。UTF8対応

前回紹介したものはエスケープはしていなかったので、XMLを出力する際には使えなかった。

理由
・エスケープしてからだとエスケープ後のエンティティが壊れてしまう可能性がある。
・丸めた後だと、バイト数がオーバーしてしまう。

以上の理由から、エスケープもしてくれるタイプを作った。


function smarty_modifier_org_escape_truncate_byte ($string, $length='', $end="…", $enc='UTF-8') {

    $length = (int)$length;
    $end = (string)$end;

    $MbLength = @mb_strlen($string, $enc);

    $ByteCount = 0;
    $ResStrings = $OverStr = '';

    for ($i=0; $i<$MbLength; $i++) {

        $str = htmlspecialchars(mb_substr($string, $i, 1, $enc));
        $len = strlen($str);

        if (($ByteCount + $len + strlen($end)) > $length && $OverStr == '')
            $OverStr = $ResStrings . $end;

        if (($ByteCount + $len) > $length) {
            return $OverStr;

        } else {
            $ResStrings .= $str;
            $ByteCount = $ByteCount + $len;
        }
    }
    return $ResStrings;
}

0 件のコメント:

コメントを投稿

Followers