让Smarty模版的变量调节器支持UTF8

Smarty的变量调节器是很爽的东西,不过对字符串的操作并不完美的支持多语言,进行修改。

<?php
/**
* template_lite truncate modifier plugin
*
* Type:     modifier
* Name:     truncate
* Purpose:  Truncate a string to a certain length if necessary,
*           optionally splitting in the middle of a word, and
*           appending the $etc string.
* Credit:   Taken from the original Smarty
*           http://smarty.php.net
*/
function tpl_modifier_truncate($string, $length = 80, $etc = ‘…’, $break_words = false)
{
if ($length == 0){
return ”;
}

if (mb_strlen($string, ‘UTF-8’) > $length) {
$length -= mb_strlen($etc);
if(!$middle) {
return mb_substr($string, 0, $length).$etc;
}
else {
return mb_substr($string, 0, $length/2) . $etc . mb_substr($string, -$length/2, $length/2, ‘UTF-8’);
}
}
else {
return $string;
}
/*
if ($length == 0)
{
return ”;
}

if (strlen($string) > $length)
{
$length -= strlen($etc);
if (!$break_words)
{
$string = preg_replace(‘/\s+?(\S+)?$/’, ”, substr($string, 0, $length+1));
}
return substr($string, 0, $length).$etc;
}
else
{
return $string;
}
*/
}
?>

让Smarty模版的变量调节器支持UTF8》上有 2 条评论

  1. Liut

    没看明白,那个$middle是什么时候赋值的?
    另外这个函数没有考虑到中英文混合的情况,在有英文的时候会出现对不齐的排版。
    另写了一个版本

    function smarty_modifier_truncate($string, $length = 80, $etc = ‘…’,
    $break_words = false, $middle = false)
    {
    if ($length == 0){
    return ”;
    }

    $utfshit = defined(‘_CHARSET’) && strtoupper(_CHARSET) === ‘UTF-8’;
    if ( $utfshit ) mb_internal_encoding(“UTF-8”);
    $strlen = ( $utfshit ? mb_strlen($string) : strlen($string) );

    $wlen = mb_strwidth($string);
    if ($strlen > $length || $wlen > $length) {
    $length -= ( $utfshit ? mb_strwidth($etc) : strlen($etc) );
    $str = “”;
    $count = 0;
    for ($i = 0; $i = $length){
    break;
    }
    }
    return $str.$etc;

    } else {
    return $string;
    }
    }

    加入对字符宽度的考虑,并且可以支持非UTF8的中文,不过感觉还有优化的余地

  2. 大鱼儿 文章作者

    仔细看了一遍代码,发现$middle是用错的.你改得比我周全,呵呵.

评论已关闭。