PHP truncate mb_substr给出了不同长度的结果

时间:2013-02-21 18:06:00

标签: php utf-8 truncate

我正在使用此函数将某些标题截断为特定长度:

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);

将在UTF8字符串上返回不同的字符串长度,看看这些字符串:

ORIGINAL STR
Mais de100cacaçasdeaviõesdeempresasfalidasserãoretiradasdeaeroportosatéofim do ano
// 98个字符

TRUNCATED STR
Mais de100cacaçasdeaviõesdeempresasfalidasserãoretiradasdeaeroportosatéofim do ...
// 94个字符 - 确定

ORIGINAL STR
NotíciasTransbrasil - 28 - MP pode atuaremaçõesfalimentaresem que aleinãodeterminasuaintertionção(STJ)
// 113 chars

TRUNCATED STR
NotíciasTransbrasil - 28 - MP pode atuaremaçõesfalimentaresem que aleinãod...
// 83 chars

这里发生了什么?为什么第二个str被截断为83个字符而不是94个字符,就像第一个str?

感谢。

1 个答案:

答案 0 :(得分: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);
}