Обрезка текста до точки
Привет. Вообщем на сайте в каталоге новостей, надо выводить часть текста из контента одной новости.(контент-менеджеры не умеют писать анатации)
Модификаторы не подходит, первый обрезает текст, только до нужного символа, а второй ещё добавляет многоточие.
Подскажите пожалуйста, может уже кто-нибудь решал данную задачу.
Модификаторы не подходит, первый обрезает текст, только до нужного символа, а второй ещё добавляет многоточие.
[[+content:limit=`400`]]
[[+content:ellipsis=`400`]]
Пробовал сниппет summary, тоже не корректно работает.[[+content:summary=`len=300&tags=1`]]
Нужно, чтобы к примеру, задал максимальную длину в 500 символов и он обрезал его до последней точки в этом пределе.Подскажите пожалуйста, может уже кто-нибудь решал данную задачу.
Комментарии: 12
Попробуй PhpHypher — мне нравится.
Хотя, судя по коду, он тоже жестко обрезает. Ну хоть переносы сделает =)
Хотя, судя по коду, он тоже жестко обрезает. Ну хоть переносы сделает =)
Не подходит, нужно, чтобы целостность предложения оставалось.
У Summary от Евгения Борисова вроде есть нужный параметр cut.
Может конечно, я что то не так делаю, но не выходит.
Но к примеру, я указал 400. 380 символ — точка, но есть также она и на 80 позиции, вот он до неё режет.
[[!summary? &text=`[[+content]]` &cut=`.` &len=`400`]]
Работает, но криво, берёт не последнею точку, а первую, хоть и написано, что работает обрезает +-100.Но к примеру, я указал 400. 380 символ — точка, но есть также она и на 80 позиции, вот он до неё режет.
Значит, придётся писать решение самостоятельно.
Вот, как вариант набросал. Без Jevix теги не обрезает лишние. А вместе с ним все идеально работает, может пригодится кому:
Сниппет «Restext»;
На ночь, много думать не хотелось, нужен результат, а он есть))
Сниппет «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 — добавляет любой символ в конце.На ночь, много думать не хотелось, нужен результат, а он есть))
Вообще полезно читать официальную документацию. Вот код примера из нее, чуть измененный
<?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`]]
У меня возникла необходимость вырезать фотографию. Некоторые статьи имеют буквально 2-3 слова, после которых идет фотография, а потом опять текст.
На сайте огромное количество статей (делали перенос сайта на MODX).
Анонсы вывожу через [[+content:limit=`150`]]
С текстом все понятно, а вот если в эти 150 символов входит фотография, то выглядит просто ужасно.
Может кто подкинет идею, как ограничить вывод в анонсе только текста.
На сайте огромное количество статей (делали перенос сайта на MODX).
Анонсы вывожу через [[+content:limit=`150`]]
С текстом все понятно, а вот если в эти 150 символов входит фотография, то выглядит просто ужасно.
Может кто подкинет идею, как ограничить вывод в анонсе только текста.
Summary ( что бы обрезать до точки) + фильтры на fenom с регуляркой что бы вырезать изображения. Вызывать сразу все феномом без тегов MODX.
По Summary спасенная документация есть на сайте Ильи Уткина. Феном тут
По Summary спасенная документация есть на сайте Ильи Уткина. Феном тут
Обрезка по кол-ву символов. Потом ищет первую точку и обрезает всё после неё. Если не находит возвращает просто обрезку по кол-ву симполов
{$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 . '.');
});
ошибка в коде.
return implode('.', $str);
вот мой код пользуюсь несколько лет
/**
* режем грамотно текст до последнего пробела
*
* @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;
}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.