Обрезка текста до точки

Привет. Вообщем на сайте в каталоге новостей, надо выводить часть текста из контента одной новости.(контент-менеджеры не умеют писать анатации)

Модификаторы не подходит, первый обрезает текст, только до нужного символа, а второй ещё добавляет многоточие.
[[+content:limit=`400`]]
[[+content:ellipsis=`400`]]
Пробовал сниппет summary, тоже не корректно работает.
[[+content:summary=`len=300&tags=1`]]
Нужно, чтобы к примеру, задал максимальную длину в 500 символов и он обрезал его до последней точки в этом пределе.

Подскажите пожалуйста, может уже кто-нибудь решал данную задачу.
Павел
Павел
03 сентября 2015, 19:19
modx.pro
11 092
Реклама

Комментарии: 12

Василий Наумкин
Василий Наумкин Администратор
03 сентября 2015, 22:22
Попробуй PhpHypher — мне нравится.

Хотя, судя по коду, он тоже жестко обрезает. Ну хоть переносы сделает =)
    Павел
    Павел Старожил
    03 сентября 2015, 22:35
    Не подходит, нужно, чтобы целостность предложения оставалось.
      Василий Наумкин
      Василий Наумкин Администратор
      03 сентября 2015, 22:37
      У Summary от Евгения Борисова вроде есть нужный параметр cut.
        Павел
        Павел Старожил
        03 сентября 2015, 22:52
        Может конечно, я что то не так делаю, но не выходит.
        [[!summary? &text=`[[+content]]` &cut=`.` &len=`400`]]
        Работает, но криво, берёт не последнею точку, а первую, хоть и написано, что работает обрезает +-100.

        Но к примеру, я указал 400. 380 символ — точка, но есть также она и на 80 позиции, вот он до неё режет.
          Василий Наумкин
          Василий Наумкин Администратор
          03 сентября 2015, 22:53
          Значит, придётся писать решение самостоятельно.
            Павел
            Павел Старожил
            03 сентября 2015, 23:34
            Вот, как вариант набросал. Без Jevix теги не обрезает лишние. А вместе с ним все идеально работает, может пригодится кому:

            Сниппет «Restext»;
            <?php
            $separator = array('?','!','.');// Разделители
            
                if(empty($len)){
                    $len = '1000';
                }
                
                $string = substr($string, 0, $len);
                $i =strlen($string);
                
                do{
                    $i--;
                }while(!in_array($string[$i], $separator) && $i >= 0);
                
                $string = substr($string, 0, $i);
                
                if(!empty($end)){
                    return $string.$end;
                }else return $string;
            Пример вызова:
            [[!Restext? &string=`[[Jevix? &input=`[[+content]]` &cfgAllowTags=`br`]]` &len=`400` &end=`.`]]
            Параметры: &string — текст для обработки, &len — максимальная длина, &end — добавляет любой символ в конце.

            На ночь, много думать не хотелось, нужен результат, а он есть))
    Сергей Шлоков
    Сергей Шлоков Старожил
    03 сентября 2015, 23:34
    Вообще полезно читать официальную документацию. Вот код примера из нее, чуть измененный
    <?php
    $output = '';
    $options = !empty($options)?$options:50;
    if (!empty($input) && !empty($options)) {
      if (strlen($input) > $options) {
        $output = substr($input, 0, strrpos(substr($input, 0, $options), '.'));
      } else{
        $output = $input;
      }
    }
    return $output;
    Засовываем это в сниппет, например, smartcuttext и вызываем
    [[+content:smartcuttext =`200`]]
      Jurij
      Jurij Старожил
      03 августа 2016, 02:34
      У меня возникла необходимость вырезать фотографию. Некоторые статьи имеют буквально 2-3 слова, после которых идет фотография, а потом опять текст.
      На сайте огромное количество статей (делали перенос сайта на MODX).

      Анонсы вывожу через [[+content:limit=`150`]]
      С текстом все понятно, а вот если в эти 150 символов входит фотография, то выглядит просто ужасно.

      Может кто подкинет идею, как ограничить вывод в анонсе только текста.
        Владимир
        Владимир Старожил
        03 августа 2016, 07:40
        Summary ( что бы обрезать до точки) + фильтры на fenom с регуляркой что бы вырезать изображения. Вызывать сразу все феномом без тегов MODX.
        По Summary спасенная документация есть на сайте Ильи Уткина. Феном тут
        Denis Bushaev
        Denis Bushaev Старожил
        25 ноября 2020, 00:12
        Обрезка по кол-ву символов. Потом ищет первую точку и обрезает всё после неё. Если не находит возвращает просто обрезку по кол-ву симполов

        {$str | excerpt : 150}
        $fenom->addModifier('excerpt', function ($str, $limit = 120) {
            $str = substr($str, 0, $limit);
            $str = explode('.', $str);
            if (count($str) > 1) unset($str[count($str) - 1]);
            return implode('.', $str . '.');
        });
          Denis Bushaev
          Denis Bushaev Старожил
          25 ноября 2020, 00:27
          ошибка в коде.
          return implode('.', $str);
          Stepan
          Stepan Старожил
          20 апреля 2021, 18:49
          вот мой код пользуюсь несколько лет

          /**
          * режем грамотно текст до последнего пробела
          * 
          * @param $text - текст
          * @param $kw - количество символов
          * @param $tagCl - очищать ли теги
          */
          function cutString($text, $kw, $tagCl = false){
          	if ($tagCl)  $text = strip_tags($text);
          	$text = substr($text, 0, $kw);
          	$text = substr($text, 0, strrpos($text, ' ' ));
          	return $text;				
          }
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            12