Заметки / Мягкое обрывание текста

PHP
 Иногда возникает необходимость сократить текст до небольшого вступления. Избежать дробления слов поможет следующая функция:
<?php

$t='Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.';

print soft_break ($t, 235);// выдаст окончание на 232 символе: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat...

function soft_break ($p, $p1)// параметрами передаём текст и количество символов
{
 $mb=true;// для UTF-8, для CP1251 - false
 $p=trim ($p);// удаляем пробелы
 $p=str_replace (array ("\r\n", "\r"), "\n", $p);// преобразуем переносы в Unix-формат
// $p=str_replace ("\n", " ", $p);// заменяем переносы на пробелы, если необходим текст без переносов
// $p=str_replace ("  ", " ", $p);// заменяем двойные пробелы на одинарные
 if ($mb)
  $l=mb_strlen ($p);// длина всего текста
 else
  $l=strlen ($p);
 $ok=false;
 $t_ar=array (".", "!", "?", "\n", ",", " ");// массив крайних символов
 foreach ($t_ar as $k=>$v)
 {
  if ($mb)
   $t=mb_strpos ($p, $v, $p1-5);// ищем с минус 5 символов до лимита
  else
   $t=strpos ($p, $v, $p1-5);
  // если символ найден до плюс 5 символов после лимита и менее, чем за 5 символов до окончания текста
  if ($t>0 && $t<$p1+5 && $t<($l-5))
  {
   $ok=true;
   if ($mb)
    $p=mb_substr ($p, 0, $t)."...";// обрываем строку
   else
    $p=substr ($p, 0, $t)."...";
   break;
  }
 }
 
 if (!$ok)// если подходящие символы не найдены по условиям выше
 {
  $t_ar=array_reverse ($t_ar);// меняем приоритет крайних символов - проще встретить ближе к лимиту пробелы и запятые, чем точки
  foreach ($t_ar as $k=>$v)
  {
   if ($mb)
    $t=mb_strpos ($p, $v, $p1-5);
   else
    $t=strpos ($p, $v, $p1-5);
   // если символ найден менее, чем за 5 символов до окончания текста...
   if ($t>0 && $t<($l-5))
   {
    if ($mb)
     $p=mb_substr ($p, 0, $t)."...";
    else
     $p=substr ($p, 0, $t)."...";
    break;
   }
  }  
 }

 return $p;// возвращаем результат
}

?>

Пример для PHP может быть адаптирован на любой язык.

30.07.2018