讓 Smarty 的 truncate 支援 UTF-8 的方法

最近因為要製作我們第一個電子商務網站不得不把荒廢以久的 Smarty 挖出來用, 到目前為止我們都是製作以內容為主的中小型企業/ 產品網站, 但是一碰到不管是功能, 邏輯, 變數都是怪獸級的電子商務, 就只能靠 Smarty 了. =_=

Well,..修改 Smarty Plugins 下的 modifier.truncate.php 即可讓 truncate 支援 UTF-8 中文的斷字

以下程式碼除了原有 smarty truncate 的功能之外, 主要就是支援 UTF-8 字元.

function smarty_modifier_truncate($string, $length = 30, $etc = '...',
$break_words = false)
{
if ($length == 0)
return '';
$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; }

Leave a Reply