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

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

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

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

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

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

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

        Но к примеру, я указал 400. 380 символ — точка, но есть также она и на 80 позиции, вот он до неё режет.
          Василий Наумкин
          03 сентября 2015, 22:53
          +1
          Значит, придётся писать решение самостоятельно.
            Павел
            03 сентября 2015, 23:34
            1
            +1
            Вот, как вариант набросал. Без 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
    2
    +3
    Вообще полезно читать официальную документацию. Вот код примера из нее, чуть измененный
    <?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
      0
      У меня возникла необходимость вырезать фотографию. Некоторые статьи имеют буквально 2-3 слова, после которых идет фотография, а потом опять текст.
      На сайте огромное количество статей (делали перенос сайта на MODX).

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

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

        {$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
          25 ноября 2020, 00:27
          0
          ошибка в коде.
          return implode('.', $str);
          Stepan
          20 апреля 2021, 18:49
          0
          вот мой код пользуюсь несколько лет

          /**
          * режем грамотно текст до последнего пробела
          * 
          * @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