首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Smarty 三大實用修飾符擴展:中文截取、UBB解析、URL解碼

     編輯:PHP 綜合知識

1. modifier.cn_truncate.php — 中文智能截取

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 個中文字符,保留首尾標籤。

2. modifier.ubb.php — UBB 代碼轉 HTML

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。

3. modifier.unescape.php — URL 編碼/Unicode 解碼

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 格式)。

安裝與註冊

  1. 將三文件放入 plugins/ 目錄
  2. Smarty 3 自動加載,Smarty 2 需在 smarty_config.php 中註冊:
    $smarty->register_modifier('cn_truncate', 'smarty_modifier_cn_truncate');

實戰場景

  • 文章列表摘要:{$article.content|strip_tags|cn_truncate:50}
  • 論壇帖子顯示:{$post.body|ubb|nl2br}
  • API 數據解碼:{$api.data|unescape}

這三個修飾符覆蓋了內容截取、富文本渲染、編碼處理三大高頻需求,是 Smarty 模板開發的利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved