主要思路是分析真箇文字,碰到標籤則開始處理,碰到非標籤開始計數,只考慮了UTF8
- function smarty_modifier_truncate_utf8_html($str,$num = 80,$more_tag = '...')
- {
- $str = trim($str);
- $leng=strlen($str);
- if($num>=$leng)
- return $str;
- $word=0;
- $i=0; /** 字串指標 **/
- $stag=array(); /** 存放開始HTML的標誌 **/
- $etag=array(); /** 存放結束HTML的標誌 **/
- $sp = 0;
- $ep = 0;
- while($word<=$num)
- {
- if($i>$leng)
- break;
- if($str[$i] == '<')
- {
- if($str[$i+1] == '!')
- {
- $i = strpos($str, '-->', $i+1) + 1;
- }
- else if ($str[$i+1]=='/')
- {
- $new_pos = strpos($str, '>', $i+1);
- $etag[] = substr( $str, $i+2, $new_pos - ($i+2) );
- $i = $new_pos + 1;
- }
- else
- {
- $tag_end_pos = strpos($str, '>', $i+1);
- $tag_space_pos = strpos($str, ' ', $i+1);
- if(!$tag_end_pos)
- $tag_end_pos = $leng;
- if(!$tag_space_pos)
- $tag_space_pos = $leng;
- if($tag_end_pos>$tag_space_pos)//have element abbritues
- {
- $stag[] = substr( $str, $i+1, $tag_space_pos - ($i+1) );
- $i = $tag_end_pos + 1;
- }
- else//no element abbritues
- {
- $stag[] = substr( $str, $i+1, $tag_end_pos - ($i+1) );
- $i = $tag_end_pos + 1;
- }
- }
- }
- else
- {
- if(ord($str[$i])>128)
- {
- //$re.=substr($str,$i,3);
- $i+=3;
- $word++;
- }
- else
- {
- $i++;
- if($str[$i-1]!="/n" && $str[$i-1]!="/r")
- {
- $word++;
- }
- }
- }
- }
- if($i>$leng)
- $i = $leng;
- //print_r($stag);
- //echo '<hr>';
- //print_r($etag);
- foreach ($etag as $val)
- {
- $key=array_search($val,$stag);
- if ($key !== false)
- unset($stag[$key]);
- }
- foreach ($stag as $key => $val)
- {
- if (in_array(strtolower($val),array('br','img')))
- unset($stag[$key]);
- }
- $stag = array_reverse($stag);
- $ends = '</'.implode('></',$stag).'>';
- $re = substr($str,0,$i).$ends;
- $re .= $more_tag;
- return $re;
- }