歡迎光臨, 訪客. 請先 登入註冊一個帳號.
四月 20, 2024, 06:30:12 下午
19595 文章 在 3865 主題 由 4580 會員
最新註冊會員: aa123aa1
LifeType 中文開發論壇  |  開發  |  外掛程式  |  解決中文斷字問題 « 上篇主題 下篇主題 »
頁: [1]
作者 主題: 解決中文斷字問題  (閱讀 15908 次)
brian
新手見習
*
文章: 18


檢視個人資料
« 於: 六月 13, 2005, 03:20:41 下午 »

將/class/template/smarty/plugins/modifier.truncate.php取代為

程式碼:

<?php
/**
 * Smarty plugin
 * @package Smarty
 * @subpackage plugins
 */


/**
 * Smarty truncate modifier plugin
 *
 * Type&#58;     modifier<br>
 * Name&#58;     truncate<br>
 * Purpose&#58;  Truncate a string to a certain length if necessary,
 *           optionally splitting in the middle of a word, and
 *           appending the $etc string.
 * @link http&#58;//smarty.php.net/manual/en/language.modifier.truncate.php
 *          truncate &#40;Smarty online manual&#41;
 * @param string
 * @param integer
 * @param string
 * @param boolean
 * @return string
 */
function smarty_modifier_truncate&#40;$string, $length = 80, $etc = '...',
                                  
$break_words false&#41;
&#123;
    
if &#40;$length == 0&#41;
        
return '';

    if &
#40;c_strlen&#40;$string&#41; > $length&#41; &#123;
        
$length -= c_strlen&#40;$etc&#41;;
//        if &#40;!$break_words&#41;
//            $string = preg_replace&#40;'/\s+?&#40;\S+&#41;?$/', '', substr&#40;$string, 0, $length+1&#41;&#41;;
//        return substr&#40;$string, 0, $length&#41;.$etc;
return c_substr&#40;$string, 0, $length&#41;.$etc;
    
&#125; else
        
return $string;
&
#125;

/* vim&#58; set expandtab&#58; */
function c_substr&#40;$str,$start=0&#41; &#123;  
    
preg_match_all&#40;"/[\x01-\x7f&#93;|[\xc2-\xdf&#93;[\x80-\xbf&#93;|\xe0[\xa0-\xbf&#93;[\x80-\xbf&#93;|[\xe1-\xef&#93;[\x80-\xbf&#93;[\x80-\xbf&#93;|\xf0[\x90-\xbf&#93;[\x80-\xbf&#93;[\x80-\xbf&#93;|[\xf1-\xf7&#93;[\x80-\xbf&#93;[\x80-\xbf&#93;[\x80-\xbf&#93;/", $str, $ar&#41;;  

    
if&#40;func_num_args&#40;&#41; >= 3&#41; &#123;  
        
$end func_get_arg&#40;2&#41;;  
        
return join&#40;"",array_slice&#40;$ar[0&#93;,$start,$end&#41;&#41;;  
    
&#125; else &#123;  
        
return join&#40;"",array_slice&#40;$ar[0&#93;,$start&#41;&#41;;  
    
&#125; 
&#125;

function c_strlen&#40;$str&#41; &#123;
  
return preg_match_all&#40;'/[\x00-\x7F\xC0-\xFD&#93;/', $str, $dummy&#41;;
&#125;
?>


已記錄

markwu
系統管理員
超級會員
*****
文章: 3928


Mark Wu


檢視個人資料 個人網站
« 回覆文章 #1 於: 六月 13, 2005, 08:49:58 下午 »

Hi Brian:

謝謝!這個會對英文其他語系有影響嗎?如果可以運作正常,我會把他 commit 到 SVN 中。 開懷大笑

Mark
已記錄

brian
新手見習
*
文章: 18


檢視個人資料
« 回覆文章 #2 於: 六月 13, 2005, 10:55:26 下午 »

有,word break會失效.

引用自: markwu
Hi Brian:

謝謝!這個會對英文其他語系有影響嗎?如果可以運作正常,我會把他 commit 到 SVN 中。 開懷大笑

Mark
已記錄

markwu
系統管理員
超級會員
*****
文章: 3928


Mark Wu


檢視個人資料 個人網站
« 回覆文章 #3 於: 六月 14, 2005, 09:32:25 上午 »

word break 在模版中似乎都沒用到,應該是沒有關係。先試試看。

Mark
已記錄

Lance Li
新手見習
*
文章: 39


檢視個人資料
« 回覆文章 #4 於: 六月 14, 2005, 10:30:13 上午 »

这段regexp的匹配规则能同时兼容GBK和BIG5吗?还是仅仅是UTF-8?
已記錄
manjublog
新手見習
*
文章: 10


檢視個人資料 個人網站
« 回覆文章 #5 於: 六月 28, 2005, 08:55:27 下午 »

我使用的,中英文正常。

程式碼:
// add Multi-Byte substr. for xiami at www.it580.com/bbs
function msubstr($str,$start,$len)
{
$strlen=$start+$len;
for($i=0;$i<$strlen;$i++)
{
if(ord(substr($str,$i,1))>0xa0)
{
$strtmp.=substr($str,$i,2);
$i++;
}
else
{
$strtmp.=substr($str,$i,1);
}
}
return $strtmp;
}
已記錄

DreamHost LifeType 1.2
markwu
系統管理員
超級會員
*****
文章: 3928


Mark Wu


檢視個人資料 個人網站
« 回覆文章 #6 於: 六月 29, 2005, 10:15:45 下午 »

Hi manjublog:

這可以用在 UTF-8,GB2312 跟 BIG5 都正常嗎?

Mark
已記錄

mickey9801
初級會員
**
文章: 58


檢視個人資料 個人網站
« 回覆文章 #7 於: 十月 16, 2005, 05:01:02 下午 »

小弟一直都只是將truncate modifier裡的substr和strlen改成mb_substr和mb_strlen,這樣改比較簡單直接一點。

程式碼:
function smarty_modifier_truncate($string, $length = 80, $etc = '...',
                                  $break_words = false)
{
    if ($length == 0)
        return '';

    if (mb_strlen($string) > $length) {
        $length -= mb_strlen($etc);
        if (!$break_words)
            $string = preg_replace('/\s+?(\S+)?$/', '', mb_substr($string, 0, $length+1));
     
        return mb_substr($string, 0, $length).$etc;
    } else
        return $string;
}

這樣改會產生其他問題嗎?
« 最後編輯時間: 十月 16, 2005, 05:06:18 下午 由 mickey9801 » 已記錄

我的網誌:http://blog.comicparty.com
LifeType 1.1.2/FEDORA CORE 3/Apache 2.0.53/PHP 4.3.11/MySQL 4.1.10/GD 2.0.21/ImageMagick 6.2.2.0
markwu
系統管理員
超級會員
*****
文章: 3928


Mark Wu


檢視個人資料 個人網站
« 回覆文章 #8 於: 十月 17, 2005, 11:13:12 上午 »

小弟一直都只是將truncate modifier裡的substr和strlen改成mb_substr和mb_strlen,這樣改比較簡單直接一點。

程式碼:
function smarty_modifier_truncate($string, $length = 80, $etc = '...',
                                  $break_words = false)
{
    if ($length == 0)
        return '';

    if (mb_strlen($string) > $length) {
        $length -= mb_strlen($etc);
        if (!$break_words)
            $string = preg_replace('/\s+?(\S+)?$/', '', mb_substr($string, 0, $length+1));
     
        return mb_substr($string, 0, $length).$etc;
    } else
        return $string;
}

這樣改會產生其他問題嗎?

為一個問題就是他要有 mb_string extension 才能使用。不過這樣改,好像真的比較簡單耶。

Mark
已記錄

頁: [1]
LifeType 中文開發論壇  |  開發  |  外掛程式  |  解決中文斷字問題 « 上篇主題 下篇主題 »
    前往: