Jump to content
  • 0

Правильная обрезка слов


StormMan
 Share

Question

Всем привет!

Есть такой модуль обрезки строки, это плагин для Smarty, но используются обычные функции:

<?php
function smarty_modifier_truncate($string, $length = 80, $etc = '...',
$break_words = false, $middle = false)
{
if ($length == 0)
return '';

if (strlen($string) > $length) {
$length -= strlen($etc);
if (!$break_words && !$middle) {
$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
}
if(!$middle) {
return substr($string, 0, $length).$etc;
} else {
return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
}
} else {
return $string;
}
}
?>

Проблема этого кода в том, что он неправильно работает с кодировкой utf-8, если символы отличаются от латиницы, и исходит эта проблема из-за того, что с многобайтными символами функция substr работать не умеет. Заменяю её на mb_substr:

<?php
function smarty_modifier_truncate($string, $length = 80, $etc = '...',
$break_words = false, $middle = false)
{
if ($length == 0)
return '';

if (mb_strlen($string, utf8) > $length) {
//if (strlen($string) > $length) {
$length -= mb_strlen($etc, utf8);
//$length -= strlen($etc);
if (!$break_words && !$middle) {
$string = mb_ereg_replace('/\s+?(\S+)?$/', '', mb_substr($string, 0, $length+1, utf8), utf8);
//$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
}
if(!$middle) {
return mb_substr($string, 0, $length, utf8).$etc;
//return substr($string, 0, $length).$etc;
} else {
return mb_substr($string, 0, $length/2, utf8) . $etc . mb_substr($string, -$length/2, utf8);
//return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
}
} else {
return $string;
}
}
?>

Остаётся одна проблема: слова обрезаются посередине, получается ерунда вроде "Слова обрезаются посе...". Подскажите, какие функции можно применить, чтобы текст обрезался правильно: "Слова обрезаются посередине...".

Буду очень благодарен за примеры!

Edited by StormMan
Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

1. ereg_replace уже устарел, его более не стоит использовать

2. Попробуйте preg_replace с модификатором u для UTF-8

3. Может, я не прав, но, по-моему правильнее писать "UTF-8" в функциях серии mb_ в кавычках - всё-таки string должен быть.

Link to comment
Share on other sites

  • 0

wordwrap не умеет с utf работать?

У меня есть регулярка, которая режет по кличеству слов, щас найду, может можно адаптировать. Как я понял, фразу надо обрезать по количеству букв, а не слов?

$wordsInnews=5;

preg_match("/^((\S+\s|\\n|$){".$wordsInnews."})/",$body,$fnd);

вот так я вырезал по 5 слов.

Edited by Int
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy