2013-02-21 3 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); 

Вернется разные строки в UTF8 длины , обратите внимание на следующие строки:

ОРИГИНАЛ STR
Маис де 100 carcaças де aviões де Empresas falidas serão retiradas де Aeroportos até о FIM сделать Ano
// 98 CHARS

усеченного STR
Маис де 100 carcaças де aviões де Empresas falidas serão retiradas де Aeroportos até о FIM сделать ...
// 94 символов - OK

ORIGINAL STR
Notícias Transbrasil - 28 - MP Pode atuar эм ações falimentares эм дие леев não determina зиа intervenção (СТП)
// 113 символов

TRUNCATED STR
Notícias Transbrasil - 28 - MP Pode atuar эм ações falimentares эм дие леев não 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) –

+0

@AntonioMax Я не совсем понимаю вас. Можете ли вы привести мне пример, что вы имели в виду? – Winston

+0

Если последнее слово, которое будет разбито, будет «não», и оно разбивается на «nã» (поэтому у нас есть «nã ...» как конец str), ваша функция - рендеринг n? ... istead из nã ... –

Смежные вопросы