【问题标题】:PHP truncate mb_substr is giving different length resultsPHP truncate mb_substr 给出不同长度的结果
【发布时间】:2013-02-21 18:06:00
【问题描述】:

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

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 字符串上返回不同的字符串长度,看看这些字符串:

原始字符串
Mais de 100 carcaças de aviões de empresas falidas serão retiradas de aeroportos até o fim do ano
// 98 个字符

截断字符串
Mais de 100 carcaças de aviões de empresas falidas serão retiradas de aeroportos até o fim do...
// 94 chars - 好的

原始字符串
Notícias Transbrasil – 28 – MP pode atuar em ações falimentares em que a lei não determina sua intervenção (STJ)
// 113 个字符

截断字符串
Notícias Transbrasil – 28 – MP pode atuar em ações falimentares em que a lei não d...
// 83 chars

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

谢谢。

【问题讨论】:

  • 我认为是因为某些 UTF8 字符由两个或三个 UNICODE 实体组成,这些差异可能是原因...

标签: php utf-8 truncate


【解决方案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);
}

【讨论】:

  • 看起来可以,但是如果中断字符有像“ã”这样的标点符号,这会将这个字符呈现为解码错误(?字符)
  • @AntonioMax 我不太了解你。你能举个例子吗?
  • 如果最后要被打破的单词是“não”并且它在“nã”上打破(所以我们有“nã...”作为str的结尾),你的功能是渲染 n?... 而不是 nã...
  • 甚至更好地将 preg_replace 替换为 mb_substr return mb_substr($str, 0, $length, 'UTF-8') . $append;
  • @AntonioMax 嗯.. 我还是不太了解你。看,我在函数 return mb_substr($str, 0, $length, 'UTF-8') . $append; 中写了我们有字符串 $str = '$str = 'Notícias Transbrasil – 28 – MP pode atuar em ações falimentares em que a lei não determina sua intervenção';' 这是 106 个字符。如果我写 echo truncateUTF8($str,94); 我会 Notícias Transbrasil – 28 – MP pode atuar em ações falimentares em que a lei não determina sua... 这是 94 个字符(没有...)。全部正确。还是我不理解你?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 2015-04-11
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
相关资源
最近更新 更多