Мультибайтовое обрезание/перенос строки.

Если обрезать или переносить (через substr(), wordwrap()) строку, написаную например в utf-8, то могут возникнуть проблемки в плане отображения букв как знаков вопроса ����

Небольшая функция, корректно переносит слова

function mb_wordwrap($string, $width=75, $break="\n", $cut = false) {
if (!$cut) {
$regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){'.$width.',}\b#U';
} else {
$regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){'.$width.'}#';
}
$string_length = mb_strlen($string,'UTF-8');
$cut_length = ceil($string_length / $width);
$i = 1;
$return = '';
while ($i < $cut_length) {
preg_match($regexp, $string,$matches);
$new_string = $matches[0];
$return .= $new_string.$break;
$string = substr($string, strlen($new_string));
$i++;
}
return $return.$string;
}
?>

и функция для корректного substr() мультибайтовых символов

// utf-8:$byte=3 | gb2312:$byte=2 | big5:$byte=2
function bite_str($string, $start, $len, $byte=3)
{
$str = "";
$count = 0;
$str_len = strlen($string);
for ($i=0; $i<$str_len; $i++) {
if (($count+1-$start)>$len) {
$str .= "...";
break;
} elseif ((ord(substr($string,$i,1)) <= 128) && ($count < $start)) {
$count++;
} elseif ((ord(substr($string,$i,1)) > 128) && ($count < $start)) {
$count = $count+2;
$i = $i+$byte-1;
} elseif ((ord(substr($string,$i,1)) <= 128) && ($count >= $start)) {
$str .= substr($string,$i,1);
$count++;
} elseif ((ord(substr($string,$i,1)) > 128) && ($count >= $start)) {
$str .= substr($string,$i,$byte);
$count = $count+2;
$i = $i+$byte-1;
}
}
return $str;
}

0.00 avg. rating (0% score) - 0 votes

7 комментариев

  • Отличный скриптик, Спасибо.
     
    А как исключить порезку ссылок? (и бб кода ) ?

    • Добавить обработку для них ))

  • А как? )))

  • Еще хотел спросить, а всякие посиски в тексте средствами ПХП (preg_match, preg_replace, strpos) не сильно нагружают? (ББ КОДЫ например)

    • Если в шаблон поиска не загонять войну и мир, то несильно нагрузят

  • Отличные функции.
    Помимо этих функций можно использовать php библиотеку mb_string, она фактически на всех хостингах есть. Просто к нужным функциям для преобразования строк нужно будет добавлять префикс mb_

css.php