142

如何限制文本的长度,例如 50,并在显示中放置三个点?

{% if myentity.text|length > 50 %}

{% block td_text %} {{ myentity.text}}{% endblock %}

{%endif%}
4

15 回答 15

224
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text  }}

你需要树枝 1.6

于 2012-10-30T16:06:53.803 回答
123

为什么不使用 twig 的 truncate 或 wordwrap 过滤器?如我所见,它属于树枝扩展,而 lib 是 Symfony2.0 的一部分。

{{ text|truncate(50) }}
于 2012-10-30T16:43:40.720 回答
37

另一个是:

{{ myentity.text[:50] ~ '...' }}
于 2013-06-15T00:00:32.337 回答
19

我知道这是一个非常古老的问题,但是从 twig 1.6 开始,您可以使用切片过滤器;

{{ myentity.text|slice(0, 50) ~ '...' }}

如果您想添加一些东西,例如省略号,波浪号的第二部分是可选的。

编辑:我的错,我看到投票最多的答案确实使用了切片过滤器。

于 2016-05-11T21:15:56.220 回答
14

@olegkhuss 使用命名为 UTF-8 Elipsis 的解决方案: {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}

于 2016-12-16T14:24:58.910 回答
9

@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(因为它可能会导致安全问题)。

于 2017-04-28T09:39:53.493 回答
9

Twig 2 和 Twig 3 的更新。

截断过滤器不可用,您可以使用u-filter代替它

这是一个例子:

{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip

{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...

注意:此过滤器是 StringExtension 的一部分,可由

twig/string-extra
于 2020-06-19T22:44:48.617 回答
6

一个更优雅的解决方案是通过字数(而不是字符数)来限制文本。这可以防止丑陋的撕裂(例如'Stackov...')。

这是一个示例,我只缩短了超过 10 个单词的文本块:

{% set text = myentity.text |split(' ') %} 

{% if text|length > 10 %} 
    {% for t in text|slice(0, 10) %}
        {{ t }} 
    {% endfor %}
    ...
{% else %}
    {{ text|join(' ') }}
{% endif %}
于 2015-12-01T11:50:30.353 回答
4

达到限制后使用截断过滤器截断字符串

{{ "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??

于 2020-01-20T14:18:40.513 回答
2

您可以通过以下方式进行限制。第一个是起始索引,第二个是字符数。

**{{ results['text'][4:2] }}**
于 2014-12-10T13:50:32.893 回答
1

如果有人需要现代世界的这个,因为这个问题太老了,我会这样做:我绝对不希望最后有一个不完整的单词,因此我更喜欢通过以下步骤来做到这一点:限制想要的字符长度,将我的文本分解成一堆用逗号或点分隔的句子数组,这取决于您的文本,删除代表不完整单词的最后一个数组,然后将这些数组连接或组合在一起,当然不要忘记将它们与我们在分解字符串时删除的那个点连接起来,在树枝 {{}} 之外添加你的三个点,据说它看起来像这样:

{{myentity.text|slice(0,50)|split('.')|slice(0,-1)|join('.')}}...

<a href="#">readeMore</a>

于 2021-06-22T18:05:18.303 回答
0

我出于同样的目的写了这个简单的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) }}
于 2015-09-11T05:47:44.170 回答
0

除了 Nemo64 在 olegkhuss 的回复下的评论之外,我想补充一点,如果您需要使部分文本以单词而不是字符结尾,您可以这样做:

entity.text|split(' ', 11)|length > 10 ? entty.text|split(' ', 11)|slice(0, 10)|join(' ') ~ '…' : entity.text

在此示例中,所有超过 10 个单词的文本将在第 10 个单词之后被剪切。

于 2021-04-07T22:41:45.613 回答
0

此处新的 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 中的“单词边界”设置不显示任何内容)。

于 2018-07-27T00:57:23.177 回答
-1

最好使用 HTML 字符

{{ entity.text[:50] }}&#8230;
于 2018-05-13T19:57:31.087 回答