function smarty_modifier_cn_truncate($string, $strlen = 20, $etc = '...', $keep_first_style = false) {
$strlen *= 2; // 中文佔 2 字節
$string = trim($string);
if (strlen($string) <= $strlen) return $string;
$str = strip_tags($string);
$j = 0;
for ($i = 0; $i < $strlen; $i++) {
if (ord(substr($str, $i, 1)) > 0xA0) $j++; // 雙字節字符計數
}
if ($j % 2 != 0) $strlen++; // 避免半個漢字
$rstr = substr($str, 0, $strlen);
if (strlen($str) > $strlen) $rstr .= $etc;
// 保留首尾 HTML 標籤(如 <b>...</b>)
if ($keep_first_style && preg_match('/^<(.*)>$/', $string)) {
$start = strpos($string, substr($str, 0, 4));
$end = strpos($string, substr($str, -4)) + 4;
$rstr = substr($string, 0, $start) . $rstr . substr($string, $end);
}
return $rstr;
}
用法:{$content|cn_truncate:30:'...':true} — 截取 30 個中文字符,保留首尾標籤。
function smarty_modifier_ubb($str) {
$ubbs = [
'quote' => ['/\[quote\](.*?)\[\/quote\]/s', '<blockquote>引用:<hr>\1<hr></blockquote>'],
'b' => ['/\[b\](.*?)\[\/b\]/s', '<b>\1</b>'],
'i' => ['/\[i\](.*?)\[\/i\]/s', '<i>\1</i>'],
'u' => ['/\[u\](.*?)\[\/u\]/s', '<u>\1</u>'],
'img' => ['/\[img\](.*?)\[\/img\]/s', '<img border="0" src="\1">'],
'url' => ['/\[url\](.*?)\[\/url\]/s', '<a href="\1" target="_blank">\1</a>'],
'email' => ['/\[email=([^\]]+)\](.*?)\[\/email\]/s', '<a href="mailto:\2">\2</a>'],
'color' => ['/\[color=([^\]]+)\](.*?)\[\/color\]/s', '<font color="\1">\2</font>'],
// ... size, align, list, table 等更多標籤
];
$str = str_replace('[*]', '<li>', $str);
foreach ($ubbs as $ubb) {
$str = preg_replace($ubb[0], $ubb[1], $str);
}
return $str;
}
用法:{$post_content|ubb} — 將論壇風格 UBB 標籤轉為安全 HTML。
function smarty_modifier_unescape($str) {
$str = rawurldecode($str);
preg_match_all("/(?:%u.{4})|[^%]+/", $str, $r);
$ar = $r[0];
foreach ($ar as $k => $v) {
if (substr($v, 0, 2) == "%u" && strlen($v) == 6) {
$ar[$k] = iconv("UCS-2", "GB2312", @pack("H4", substr($v, -4)));
}
}
return join("", $ar);
}
用法:{$encoded_url|unescape} — 處理 JavaScript escape() 編碼的字符串(含 %uXXXX Unicode 格式)。
plugins/ 目錄smarty_config.php 中註冊:$smarty->register_modifier('cn_truncate', 'smarty_modifier_cn_truncate');{$article.content|strip_tags|cn_truncate:50}{$post.body|ubb|nl2br}{$api.data|unescape}這三個修飾符覆蓋了內容截取、富文本渲染、編碼處理三大高頻需求,是 Smarty 模板開發的利器。