4 三月, 2005
echo几次反映,她的文章在首页上的Latest Posts里显示总是为“...”。今天查看了一下代码,发现原来是trauncate这个modifier在处理中文时有个小bug。in template/summary/recent.template, 相应的语句是{$post->getText()|strip_tags|truncate:200:"..."}
意思是说去除文本中的html标记,截取前面的200个字符,如果长度大于200,后面的文本以"..."代替
truncate是Smarty的一个Modifier,源码在class/template/smarty/plugins/modifier.truncate.php。这个修饰过程处理英文文本工作正常,但是在处理中文文本时,会有问题。
问题出在这里:
...
if (!$break_words)
$string = preg_replace('/s+?(S+)?$/', '', substr($string, 0, $length+1));
...
break_words表示是否允许一个单词被截断,缺省值是false,即不允许。英文中有单词这个概念,中文里则没有。S匹配的是所有除了空白、回车、换行、制表等字符以外的字符,而中文字符在UTF-8中是以3个高位为1的字节表示的,和S匹配相符,所以会发生所有的文本被替换为空的现象。
解决方法:
为了让这个修饰过程既能处理英文也能处理中文,并且不影响现在的应用,修改的范围尽可能的小,这里用w替换程序中的S,只匹配[a-zA-Z_]中的字符。这样,既满足不允许单词被中间截断的要求,又能正确处理中文。
最新回复
发表评论



