hi bibicall:
我解決了!
問題出在
strip_tags 的使用方式。如果把 summary/post.template 改成如下:
{assign var="blog" value=$post->getBlogInfo()}
{assign var="request" value=$blog->getBlogRequestGenerator()}
<h5><a href="{$request->postPermalink($post)}">{$post->getTopic()}</a></h5>
<div class="subtitle">
{$locale->tr("blog")} <a href="{$request->blogLink()}">{$blog->getBlog()}</a>
</div>
<p>
{$post->getText()|strip_tags:false|truncate:200:"..."}
</p>
......後略.......
就不會文章內容被 strip_tags 給吃掉了。strip_tags 預設是讓 HTML 標籤用空格取代。可是 smarty 內部是用一個正規表示式做這件事:
preg_replace('!<[^>]*?>!', ' ', $string);
我想,這樣做應該是沒有考慮到 utf-8 的中文字裡,可能有等同 '<' 和 '>' 的字碼在內,所以內容被吃掉了(這部份純屬猜測)。若在樣版裡面使用 strip_tags:false ,則是 HTML 標籤不用空格取代,重點是,他用的是 PHP 的 strip_tags 函數,所以沒有誤判。
我想,如果把正規表示式加點修改,讓他能支援 utf-8 文字的判斷,應該就不會再有內文被吃掉的情況了。比如說改成下面這樣:
preg_replace('!<[^>]*?>!u', ' ', $string);
加上一個小寫 u 做修飾子,讓他支援 utf-8 大概就行了。有空再驗證看看。不過,這樣做,每回 lifetype 更新 smarty 版本時,大概都得改一次,有點小麻煩。