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

 
Посетитель
small user social cms
Медаль
Сообщений: 444
Двойка по умолчанию неплохо справляется с данной задачей, но хотелось бы лучше. Текст режется по заданному количеству символов, в конце предложения получаются в виде обрубков.

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

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

Код PHP:
  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

Вот код по умолчанию:
Код PHP:
  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.  
Это с найденным на форуме решением, подставляет многоточие:

Код PHP:
  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-й это максимальное количество символов которое должно быть после обработки строки.

Код PHP:
  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);
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 3589
Pasechnik:
строка 5 немного запутанна
Pasechnik:
узнаем количество символов от конца до пробела.
получаем разницу длины “грубо” обрезанной строки и количество символов от конца до пробела.
предыдущим пунктом мы получили номер нужного нам символа(последнего). Теперь возвращаем под строку с начала до “нужного символа” .
возвращаем результат
hoho
Pasechnik:
как использовать функцию ?
поместите функцию в конец файла и используйте как описали
Код PHP:
  1. <?php echo substring('Тут строка для обрезки',200);?>
Реклама
cms
Посетитель
small user social cms
МедальКубок зрительских симпатий
Сообщений: 394
Можно ешё так.

На быструю руку
Посетитель
small user social cms
Медаль
Сообщений: 352
Pasechnik:
строка 5 немного запутанна потому ее алгоритм отдельно.
узнаем количество символов от конца до пробела.
получаем разницу длины “грубо” обрезанной строки и количество символов от конца до пробела.
предыдущим пунктом мы получили номер нужного нам символа(последнего). Теперь возвращаем под строку с начала до “нужного символа” .
возвращаем результат
Идеально выполнить так:
# возвращается строка всех символов, включая предстоящий пробел последнего нецелого слова:
Редактировалось: 2 раз (Последний: 15 августа 2016 в 21:35)
Посетитель
small user social cms
МедальПочетный донор проектаКубок зрительских симпатийАвторитет форумаПочетный донор проекта
Сообщений: 2818
Pasechnik, в light-news встроена своя обрезка. Слова не режутся, знаки препинания в конце обрезанного текста учитываются.
В виджетах списка новостей можно резать до нужного количества знаков заголовок и описание отдельно.
Чем не устраивает?
Украинский для инстант
Посетитель
small user social cms
Медаль
Сообщений: 444
Олег Васильевич я:
Pasechnik, в light-news встроена своя обрезка. Слова не режутся, знаки препинания в конце обрезанного текста учитываются.
В виджетах списка новостей можно резать до нужного количества знаков заголовок и описание отдельно.
Чем не устраивает?
На light-news у меня все заморозилось, не хватает времени. Посмотрел сейчас. Олег Васильевич, спасибо!
Посетитель
small user social cms
Медаль
Сообщений: 444
Сделал по подобию light-news, не знаю насколько верно, но работает. smile Вопрос решен.
В начало страницы
Предыдущая темаСледующая тема Перейти на форум: