Вопрос по обрезке текста в виджетах

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#1 15 августа 2016 в 18:06
Двойка по умолчанию неплохо справляется с данной задачей, но хотелось бы лучше. Текст режется по заданному количеству символов, в конце предложения получаются в виде обрубков.

Из приведенных текстуальных фрагментов видно, как матрица абсурдно просветляет диалогический контекст, где автор является полновла


Немного улучшило ситуацию решение, найденное на страницах данного форума:

  1. <?php if( mb_strlen($item[$teaser_field], 'UTF-8') > 130 ){ $item[$teaser_field] = mb_substr($item[$teaser_field], 0, 130, 'UTF-8') . '...'; } echo ($item[$teaser_field]);?>
В конце подставляются точки, что в некоторой степени делает обрубленные предложения более логично завершенными, но слова остаются обрубленными, и это не есть гуд.

Из приведенных текстуальных фрагментов видно, как матрица абсурдно просветляет диалогический контекст, где автор является полновла...


В своих закладках нашел решение от одного очень уважаемого мной человека, блог которого канул в лету, но листок с кодом у меня остался. Функция позволяет обрезать текст, оставляя слова целыми.

Кто разбирается в php, помогите прикрутить. smile

Вот код по умолчанию:
  1.  
  2. <div class="teaser">
  3. <?php if (!$is_private) { ?>
  4. <?php echo string_short($item[$teaser_field], $teaser_len); ?>
  5. <?php } else { ?>
  6. <!--noindex--><div class="private_field_hint"><?php echo LANG_PRIVACY_PRIVATE_HINT; ?></div><!--/noindex-->
  7. <?php } ?>
  8. </div>
  9.  
Это с найденным на форуме решением, подставляет многоточие:

  1. <div class="teaser">
  2. <?php if (!$is_private) { ?>
  3. <?php if( mb_strlen($item[$teaser_field], 'UTF-8') > 130 ){ $item[$teaser_field] = mb_substr($item[$teaser_field], 0, 130, 'UTF-8') . '...'; } echo ($item[$teaser_field]);?>
  4. <?php } else { ?>
  5. <!--noindex--><div class="private_field_hint"><?php echo LANG_PRIVACY_PRIVATE_HINT; ?></div><!--/noindex-->
  6. <?php } ?>
  7. </div>
Вот решение, оставляющее слова целыми, его бы прикрутить:

Функция принимает 2 параметра. Первый параметр строка которую нужно обработать, 2-й это максимальное количество символов которое должно быть после обработки строки.

  1. function substring($str,$count=110){
  2. $str=strip_tags($str);
  3. if (strlen($str)>$count) {
  4. $substr=substr($str,0,$count-1);
  5. return substr($substr,0,strlen($substr)-strlen(strrchr(substr($str,0,$count-1)," "))+1)."[...]";
  6. }else{
  7. return $str;
  8. }
  9. }
алгоритм работы функции:

убираем теги html
Если длина строки меньше чем максимальное к-ко необходимых символов, обрезать ничего не надо просто выводим строку.
строка 4 возвращает под строку с начала и до n-го символа. n- максимальная длина строки. Но эта функция “режит” слова.
строка 5 немного запутанна потому ее алгоритм отдельно.
узнаем количество символов от конца до пробела.
получаем разницу длины “грубо” обрезанной строки и количество символов от конца до пробела.
предыдущим пунктом мы получили номер нужного нам символа(последнего). Теперь возвращаем под строку с начала до “нужного символа” .
возвращаем результат

как использовать функцию ?

$str='
— Сим удостоверяю, что предъявитель сего Николай Иванович провел упомянутою ночь на балу у сатаны, будучи привлечен туда в качестве перевозочного средства… поставь, Гелла, скобку! В скобке пиши "боров". Подпись — Бегемот.
— А число? — пискнул Николай Иванович.
— чисел не ставим, с числом бумага станет недействительной, — отозвался кот, подмахнул бумагу, откуда-то добыл печать, по всем правилам подышал на нее, оттиснул на бумаге слово "уплочено" и вручил бумагу Николаю Ивановичу.'

;
echo substring($str,200);
#2 15 августа 2016 в 19:12

строка 5 немного запутанна

Pasechnik

узнаем количество символов от конца до пробела.
получаем разницу длины “грубо” обрезанной строки и количество символов от конца до пробела.
предыдущим пунктом мы получили номер нужного нам символа(последнего). Теперь возвращаем под строку с начала до “нужного символа” .
возвращаем результат

Pasechnik
hoho

как использовать функцию ?

Pasechnik
поместите функцию в конец файла и используйте как описали
  1. <?php echo substring('Тут строка для обрезки',200);?>
#4 15 августа 2016 в 20:45

строка 5 немного запутанна потому ее алгоритм отдельно.
узнаем количество символов от конца до пробела.
получаем разницу длины “грубо” обрезанной строки и количество символов от конца до пробела.
предыдущим пунктом мы получили номер нужного нам символа(последнего). Теперь возвращаем под строку с начала до “нужного символа” .
возвращаем результат

Pasechnik
Идеально выполнить так:
# возвращается строка всех символов, включая предстоящий пробел последнего нецелого слова:
#5 15 августа 2016 в 20:58
Pasechnik, в light-news встроена своя обрезка. Слова не режутся, знаки препинания в конце обрезанного текста учитываются.
В виджетах списка новостей можно резать до нужного количества знаков заголовок и описание отдельно.
Чем не устраивает?
#6 15 августа 2016 в 21:08

Pasechnik, в light-news встроена своя обрезка. Слова не режутся, знаки препинания в конце обрезанного текста учитываются.
В виджетах списка новостей можно резать до нужного количества знаков заголовок и описание отдельно.
Чем не устраивает?

Олег Васильевич я
На light-news у меня все заморозилось, не хватает времени. Посмотрел сейчас. Олег Васильевич, спасибо!
#7 15 августа 2016 в 22:38
Сделал по подобию light-news, не знаю насколько верно, но работает. smileВопрос решен.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.