2013-02-21 62 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