如何限制文本的长度,例如 50,并在显示中放置三个点?
{% if myentity.text|length > 50 %}
{% block td_text %} {{ myentity.text}}{% endblock %}
{%endif%}
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text }}
你需要树枝 1.6
为什么不使用 twig 的 truncate 或 wordwrap 过滤器?如我所见,它属于树枝扩展,而 lib 是 Symfony2.0 的一部分。
{{ text|truncate(50) }}
另一个是:
{{ myentity.text[:50] ~ '...' }}
我知道这是一个非常古老的问题,但是从 twig 1.6 开始,您可以使用切片过滤器;
{{ myentity.text|slice(0, 50) ~ '...' }}
如果您想添加一些东西,例如省略号,波浪号的第二部分是可选的。
编辑:我的错,我看到投票最多的答案确实使用了切片过滤器。
@olegkhuss 使用命名为 UTF-8 Elipsis 的解决方案:
{{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}
@mshobnr / @olegkhuss 解决方案变成了一个简单的宏:
{% macro trunc(txt, len) -%}
{{ txt|length > len ? txt|slice(0, len) ~ '…' : txt }}
{%- endmacro %}
使用示例:
{{ tools.trunc('This is the text to truncate. ', 50) }}
注意,我导入了一个包含宏的 Twig 模板并将其作为“工具”导入,如下所示(Symfony):
{% import "@AppBundle/tools.html.twig" as tools -%}
另外,我用实际字符替换了html字符代码,使用UTF-8作为文件编码应该没有问题。这样您就不必使用|raw
(因为它可能会导致安全问题)。
Twig 2 和 Twig 3 的更新。
这是一个例子:
{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip
{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...
注意:此过滤器是 StringExtension 的一部分,可由
twig/string-extra
一个更优雅的解决方案是通过字数(而不是字符数)来限制文本。这可以防止丑陋的撕裂(例如'Stackov...')。
这是一个示例,我只缩短了超过 10 个单词的文本块:
{% set text = myentity.text |split(' ') %}
{% if text|length > 10 %}
{% for t in text|slice(0, 10) %}
{{ t }}
{% endfor %}
...
{% else %}
{{ text|join(' ') }}
{% endif %}
达到限制后使用截断过滤器截断字符串
{{ "Hello World!"|truncate(5) }} // default separator is ...
你好...
您还可以通过将第二个参数设置为 true 来告诉 truncate 保留整个单词。如果最后一个 Word 在分隔符上,则 truncate 将打印出整个 Word。
{{ "Hello World!"|truncate(7, true) }} // preserve words
这里你好世界!
如果要更改分隔符,只需将第三个参数设置为所需的分隔符即可。
{{ "Hello World!"|truncate(7, false, "??") }}
你好W??
您可以通过以下方式进行限制。第一个是起始索引,第二个是字符数。
**{{ results['text'][4:2] }}**
如果有人需要现代世界的这个,因为这个问题太老了,我会这样做:我绝对不希望最后有一个不完整的单词,因此我更喜欢通过以下步骤来做到这一点:限制想要的字符长度,将我的文本分解成一堆用逗号或点分隔的句子数组,这取决于您的文本,删除代表不完整单词的最后一个数组,然后将这些数组连接或组合在一起,当然不要忘记将它们与我们在分解字符串时删除的那个点连接起来,在树枝 {{}} 之外添加你的三个点,据说它看起来像这样:
{{myentity.text|slice(0,50)|split('.')|slice(0,-1)|join('.')}}...
<a href="#">readeMore</a>
我出于同样的目的写了这个简单的marco,希望对您有所帮助:
{%- 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) }}
除了 Nemo64 在 olegkhuss 的回复下的评论之外,我想补充一点,如果您需要使部分文本以单词而不是字符结尾,您可以这样做:
entity.text|split(' ', 11)|length > 10 ? entty.text|split(' ', 11)|slice(0, 10)|join(' ') ~ '…' : entity.text
在此示例中,所有超过 10 个单词的文本将在第 10 个单词之后被剪切。
此处新的 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 中的“单词边界”设置不显示任何内容)。
最好使用 HTML 字符
{{ entity.text[:50] }}…