Как я могу ограничить длину текста, например, 50, и поставить на дисплей три точки?
{% if myentity.text|length > 50 %}
{% block td_text %} {{ myentity.text}}{% endblock %}
{%endif%}
Как я могу ограничить длину текста, например, 50, и поставить на дисплей три точки?
{% if myentity.text|length > 50 %}
{% block td_text %} {{ myentity.text}}{% endblock %}
{%endif%}
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text }}
Вам нужен Twig 1.6.
{{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}
. Я также рекомендую использовать символ многоточия (…
) вместо 3 реальных точек (...
).
- person Nemo64; 31.07.2017
{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
- person Matias Kinnunen; 18.01.2018
|length
после первого text
, но это прекрасно, спасибо!
- person mtefi; 24.10.2018
почему бы не использовать фильтр twig truncate или wordwrap? Он принадлежит расширению ветки, а lib, как я вижу, является частью Symfony2.0.
{{ text|truncate(50) }}
...
, второй параметр должен быть установлен на true
, например {{ text|truncate(50, true)
- person Sithu; 12.05.2017
require twig/extensions
- person beta; 10.08.2017
Еще один:
{{ myentity.text[:50] ~ '...' }}
Я знаю, что это очень старый вопрос, но в ветке 1.6 вы можете использовать фильтр срезов;
{{ myentity.text|slice(0, 50) ~ '...' }}
Вторая часть тильды необязательна, если вы хотите что-то добавить, например, многоточие.
Изменить. Плохо, я вижу, что в ответе, получившем наибольшее количество голосов, используется фильтр срезов.
Решение @olegkhuss с именем UTF-8 Elipsis:
{{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}
text
.
- person emix; 05.02.2018
Решение @mshobnr / @olegkhuss в виде простого макроса:
{% macro trunc(txt, len) -%}
{{ txt|length > len ? txt|slice(0, len) ~ '…' : txt }}
{%- endmacro %}
Пример использования:
{{ tools.trunc('This is the text to truncate. ', 50) }}
N.b. Я импортирую шаблон Twig, содержащий макросы, и импортирую его как такие «инструменты» (Symfony):
{% import "@AppBundle/tools.html.twig" as tools -%}
Кроме того, я заменил код символа html фактическим символом, это не должно быть проблемой при использовании UTF-8 в качестве кодировки файла. Таким образом, вам не нужно использовать |raw
(поскольку это может вызвать проблемы с безопасностью).
Еще более элегантное решение - ограничить текст количеством слов (а не количеством символов). Это предотвращает некрасивые надрывы (например, «Стакков ...»).
Вот пример, в котором я сокращаю только текстовые блоки длиной более 10 слов:
{% set text = myentity.text |split(' ') %}
{% if text|length > 10 %}
{% for t in text|slice(0, 10) %}
{{ t }}
{% endfor %}
...
{% else %}
{{ text|join(' ') }}
{% endif %}
Обновление для Twig 2 и Twig 3.
фильтр усечения недоступен, вместо него вы можете использовать u-filter а>
вот пример:
{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip
{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...
Примечание: этот фильтр является частью StringExtension, который может потребоваться
twig/string-extra
Twig\Extra\String\StringExtension: null
в twig_extensions.yaml
- person Jean-Christophe Meillaud; 04.03.2021
Вы можете ограничить следующим образом. Первый - это начальный индекс, а второй - количество символов.
**{{ results['text'][4:2] }}**
Используйте фильтр усечения, чтобы обрезать строку после достижения лимита
{{ "Hello World!"|truncate(5) }} // default separator is ...
Привет...
Вы также можете указать truncate сохранять целые слова, установив для второго параметра значение true. Если последнее слово находится на разделителе, усечение распечатает все слово.
{{ "Hello World!"|truncate(7, true) }} // preserve words
Привет, мир!
Если вы хотите изменить разделитель, просто установите третий параметр на желаемый разделитель.
{{ "Hello World!"|truncate(7, false, "??") }}
Привет W ??
Я написал этот простой марко для той же цели, надеюсь, это поможет:
{%- macro stringMaxLength(str, maxLength) -%}
{%- if str | length < maxLength -%}
{{ str }}
{%- else -%}
{{ str|slice(0, maxLength) }}...
{%- endif -%}
{%- endmacro -%}
Пример использования №1 (Вывод: «моя длинная строка здесь ...»):
{{ _self.stringMaxLength("my long string here bla bla bla la", 20) }}
Пример использования № 2 (Вывод: «более короткая строка!»):
{{ _self.stringMaxLength("shorter string!", 20) }}
Ошибка * в новых возможностях Drupal 8 вдохновила нас на написание собственных:
<a href="{{ view_node }}">{% if title|length > 32 %}{% set title_array = title|split(' ') %}{% set title_word_count = 0 %}{% for ta in title_array %}{% set word_count = ta|length %}{% if title_word_count < 32 %}{% set title_word_count = title_word_count + word_count %}{{ ta }} {% endif %}{% endfor %}...{% else %}{{ title }}{% endif %}</a>
При этом учитываются как слова, так и символы (* настройка «границы слова» в D8 ничего не отображала).
В дополнение к комментарию Nemo64 под ответом olegkhuss, я хотел бы добавить, что если вам нужно закончить частичный текст на слове, а не на символе, вы можете сделать это:
entity.text|split(' ', 11)|length > 10 ? entty.text|split(' ', 11)|slice(0, 10)|join(' ') ~ '…' : entity.text
В этом примере весь текст, содержащий более 10 слов, будет вырезан после 10-го слова.
если кому-то это нужно из современного мира, поскольку этот вопрос очень старый, я бы сделал это так: я определенно не хотел бы иметь неполное слово в конце, поэтому я предпочитаю сделать это со следующими шагами: ограничение желаемую длину символов, разбейте мой текст на кучу массивов предложений, разделенных запятой или точкой, в зависимости от вашего текста, удалите последний массив, который представляет неполное слово, затем объедините или взломайте эти массивы вместе и, конечно, не забудьте соедините их с той точкой, которую мы удалили при расчленении строки символов, и за пределами ветки {{}} добавьте свои три точки, при этом, как было сказано, это будет выглядеть примерно так:
{{myentity.text|slice(0,50)|split('.')|slice(0,-1)|join('.')}}...
<a href="#">readeMore</a>
Лучше использовать символ HTML
{{ entity.text[:50] }}…
…
.
- person Théo Attali; 09.01.2019
...
, а это многоточие…
- person Luke Cousins   schedule 18.05.2017