2013-02-21 60 views
1

我使用這個函數來截斷某些標題一定長度的結果: PHP截斷mb_substr是給不同長度

function truncateUTF8($str, $length, $breakWords = TRUE, $append = '...') { 
    $strLength = mb_strlen($str); 
    if ($strLength <= $length) { 
     return $str; 
    } 
    if (!$breakWords) { 
     while ($length < $strLength AND preg_match('/^\pL$/', mb_substr($str, $length, 1))) { 
     $length++; 
     } 
    } 
    return rtrim(mb_substr($str, 0, $length)) . $append; 
} 

呼叫:

echo truncateUTF8($str,94); 

將返回不同的字符串lenghts上UTF8看看這些字符串:

ORIGINAL STR
個MAÏSDE 100carcaças德aviões德EMPRESAS falidasserãoretiradas德aeroportos ATEöFIM做ANO
// 98個字符

TRUNCATED STR
MAÏSDE 100carcaças德aviões德EMPRESAS falidasserãoretiradas德aeroportos吃ØFIM做...
// 94個字符 - 確定

ORIGINAL STR
NOTICIAS Transbrasil - 28 - MP頗得atuar EMaçõesfalimentares EM闕花環NAO Determina的SUAintervenção(STJ)
// 113字符

TRUNCATED STR
NOTICIAS Transbrasil - 28 - MP頗得atuar EM açõesfalimentares EM闕林雷NAO d ...
// 83個字符

這是怎麼回事?爲什麼第二個str被截斷爲83個字符而不是94個字符,就像第一個字符?

謝謝。

+0

我想是因爲它的,因爲某些UTF8字符由兩個或三個UNICODE實體,這些差異可能是原因... – 2013-02-21 18:09:19

回答

1

試試吧

function truncateUTF8($str, $length, $breakWords = TRUE, $append = '...') { 
    $strLength = mb_strlen($str); 
    if ($strLength <= $length) 
     return $str; 
    return preg_replace('/(.{' . $length . '}).*/u', '$1' . $append, $str); 
} 
+0

看起來像它的工作原理,但如果間隔符標點像「ã」,這會使這個字符作爲解碼錯誤(?char) – 2013-02-21 18:49:25

+0

@AntonioMax我不太瞭解你。你能舉個例子說明你的意思嗎? – Winston 2013-02-21 18:59:47

+0

如果最終的單詞是「não」,並且它打破了「n」(所以我們有「n ......」作爲str的結尾),你的函數渲染n?... istead n°... – 2013-02-21 19:06:53