注意:具体用法可参考smarty手册 Extending Smarty With Plugins [以插件扩展Smarty] 部分


如:{{assign var=fuyongjie value="我是中国人 chinese people" }}
    {{$fuyongjie|
truncate_utf8_string:6:""}}








文件名:modifier.smart_truncate_gb2312_string.php
<?php
function smarty_modifier_smart_truncate_gb2312_string($string, $length, $etc = '..')
{
    
$result = '';

    
$string = html_entity_decode(trim(strip_tags($string)), ENT_QUOTES, 'gb2312');

    
for($i = 0, $j = 0$i < strlen($string); $i++)
    {
        
if($j >= $length)
        {
            
for($x = 0, $y = 0$x < strlen($etc); $x++)
            {
                
if(ord(substr($etc, $x, 1)) > 128)
                {
                    
$x++;
                    
$y++;
                }
                
else
                {
                    
$y += 0.5;
                }
            }

            
$length -= $y;

            
break;
        }

        
if(ord(substr($string, $i, 1)) > 128)
        {
            
$i++;
            
$j++;
        }
        
else
        {
            
$j += 0.5;
        }
    }

    
for($i = 0; (($i < strlen($string)) && ($length > 0)); $i++)
    {
        
if(ord(substr($string, $i, 1)) > 128)
        {
            
if($length < 1.0)
            {
                
break;
            }

            
$result .= substr($string, $i, 2);
            
$length -= 1.0;

            
$i++;
        }
        
else
        {
            
$result .= substr($string, $i, 1);
            
$length -= 0.5;
        }
    }

    
$result = htmlentities($result, ENT_QUOTES, 'gb2312');

    
if($i < strlen($string))
    {
        
$result .= $etc;
    }

    
return $result;
}
?>

下面看看UTF
-8的相关实现,其实大体都是一样的。

文件名:modifier
.smart_truncate_utf8_string.php

<?php
function smarty_modifier_smart_truncate_utf8_string($string, $length, $etc = '..')
{
    
$result = '';

    
$string = html_entity_decode(trim(strip_tags($string)), ENT_QUOTES, 'utf-8');

    
for($i = 0, $j = 0$i < strlen($string); $i++)
    {
        
if($j >= $length)
        {
            
for($x = 0, $y = 0$x < strlen($etc); $x++)
            {
                
if($number = strpos(str_pad(decbin(ord(substr($string, $i, 1))), 8, '0', STR_PAD_LEFT), '0'))
                {
                    
$x += $number - 1;
                    
$y++;
                }
                
else
                {
                    
$y += 0.5;
                }
            }

            
$length -= $y;

            
break;
        }

        
if($number = strpos(str_pad(decbin(ord(substr($string, $i, 1))), 8, '0', STR_PAD_LEFT), '0'))
        {
            
$i += $number - 1;
            
$j++;
        }
        
else
        {
            
$j += 0.5;
        }
    }

    
for($i = 0; (($i < strlen($string)) && ($length > 0)); $i++)
    {
        
if($number = strpos(str_pad(decbin(ord(substr($string, $i, 1))), 8, '0', STR_PAD_LEFT), '0'))
        {
            
if($length < 1.0)
            {
                
break;
            }

            
$result .= substr($string, $i, $number);

            
$length -= 1.0;

            
$i += $number - 1;
        }
        
else
        {
            
$result .= substr($string, $i, 1);

            
$length -= 0.5;
        }
    }

    
$result = htmlentities($result, ENT_QUOTES, 'utf-8');

    
if($i < strlen($string))
    {
        
$result .= $etc;
    }

    
return $result;
}
?>

文章引用自: