主題: 解決中文斷字問題
作者: brian 於 六月 13, 2005, 03:20:41 下午
將/class/template/smarty/plugins/modifier.truncate.php取代為 <?php /** * Smarty plugin * @package Smarty * @subpackage plugins */
/** * Smarty truncate modifier plugin * * Type: modifier<br> * Name: truncate<br> * Purpose: Truncate a string to a certain length if necessary, * optionally splitting in the middle of a word, and * appending the $etc string. * @link http://smarty.php.net/manual/en/language.modifier.truncate.php * truncate (Smarty online manual) * @param string * @param integer * @param string * @param boolean * @return string */ function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false) { if ($length == 0) return '';
if (c_strlen($string) > $length) { $length -= c_strlen($etc); // if (!$break_words) // $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1)); // return substr($string, 0, $length).$etc; return c_substr($string, 0, $length).$etc; } else return $string; }
/* vim: set expandtab: */ function c_substr($str,$start=0) { preg_match_all("/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/", $str, $ar);
if(func_num_args() >= 3) { $end = func_get_arg(2); return join("",array_slice($ar[0],$start,$end)); } else { return join("",array_slice($ar[0],$start)); } }
function c_strlen($str) { return preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $dummy); } ?>
主題: 解決中文斷字問題
作者: markwu 於 六月 13, 2005, 08:49:58 下午
Hi Brian:
謝謝!這個會對英文其他語系有影響嗎?如果可以運作正常,我會把他 commit 到 SVN 中。 :-D
Mark
主題: 解決中文斷字問題
作者: brian 於 六月 13, 2005, 10:55:26 下午
有,word break會失效. Hi Brian:
謝謝!這個會對英文其他語系有影響嗎?如果可以運作正常,我會把他 commit 到 SVN 中。 :-D
Mark
主題: 解決中文斷字問題
作者: markwu 於 六月 14, 2005, 09:32:25 上午
word break 在模版中似乎都沒用到,應該是沒有關係。先試試看。
Mark
主題: 解決中文斷字問題
作者: Lance Li 於 六月 14, 2005, 10:30:13 上午
这段regexp的匹配规则能同时兼容GBK和BIG5吗?还是仅仅是UTF-8?
主題: 解決中文斷字問題
作者: manjublog 於 六月 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; }
主題: 解決中文斷字問題
作者: markwu 於 六月 29, 2005, 10:15:45 下午
Hi manjublog:
這可以用在 UTF-8,GB2312 跟 BIG5 都正常嗎?
Mark
主題: Re: 解決中文斷字問題
作者: mickey9801 於 十月 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; }
這樣改會產生其他問題嗎?
主題: Re: 解決中文斷字問題
作者: markwu 於 十月 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
|