symfony 2 twig限制文本的长度并放三个点

GRa*_*oKI 114 symfony twig

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

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

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

{%endif%}
Run Code Online (Sandbox Code Playgroud)

小智 193

{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text  }}
Run Code Online (Sandbox Code Playgroud)

你需要Twig 1.6

  • 另外,如果你想裁掉一个单词,你可以这样做:`{{text> 50?text | slice(0,51)| split('')| slice(0,-1)| join('')〜'...':text}}`.我还建议使用省略号字符(`...`)而不是3个真正的点(```) (10认同)
  • 更短:`{{myentity.text [:50]〜(myentity.text | length> 50?'...')}}` (2认同)

mrM*_*tir 107

为什么不使用twig的truncate或wordwrap过滤器?它属于twig扩展,lib是我看到的Symfony2.0的一部分.

{{ text|truncate(50) }}
Run Code Online (Sandbox Code Playgroud)

  • 要在Symfony中启用扩展,请将其添加到您的一个配置文件中:https://gist.github.com/pschultz/f33bfff72692ca0b6916 (7认同)
  • 我正在使用Symfony 2.3,截断过滤器不是默认扩展的一部分.因此,我采用了曼努埃尔的解决方案. (4认同)

Man*_*tto 35

另一个是:

{{ myentity.text[:50] ~ '...' }}
Run Code Online (Sandbox Code Playgroud)

  • 唯一的问题是它总是显示点......:/我想我会选择第一个解决方案. (6认同)

小智 16

我知道这是一个非常古老的问题,但是从树枝1.6开始你可以使用切片滤镜;

{{ myentity.text|slice(0, 50) ~ '...' }}
Run Code Online (Sandbox Code Playgroud)

如果要添加某些内容(例如省略号),则代字号的第二部分是可选的.

编辑:我的不好,我看到最多投票的答案确实利用了切片过滤器.

  • And this code always appends the "…" (8认同)

Mat*_*ner 9

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

  • 请记住,此解决方案通过`text`变量启用HTML注入. (2认同)

got*_*oto 7

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

{{ "Hello World!"|truncate(5) }} // default separator is ...
Run Code Online (Sandbox Code Playgroud)

你好...

您还可以通过将第二个参数设置为 true 来告诉 truncate 保留整个单词。如果最后一个单词位于分隔符上,则截断将打印出整个单词。

 {{ "Hello World!"|truncate(7, true) }} // preserve words
Run Code Online (Sandbox Code Playgroud)

这里你好世界!

如果您想更改分隔符,只需将第三个参数设置为您想要的分隔符即可。

{{ "Hello World!"|truncate(7, false, "??") }} 
Run Code Online (Sandbox Code Playgroud)

你好W??


小智 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 %}
Run Code Online (Sandbox Code Playgroud)


Gra*_*tak 6

将@mshobnr / @olegkhuss解决方案制成一个简单的宏:

{% macro trunc(txt, len) -%}
    {{ txt|length > len ? txt|slice(0, len) ~ '…' : txt }}
{%- endmacro %}
Run Code Online (Sandbox Code Playgroud)

用法示例:

{{ tools.trunc('This is the text to truncate. ', 50) }}
Run Code Online (Sandbox Code Playgroud)

Nb我导入一个包含宏的Twig模板,并将其作为“工具”导入,如下所示(Symfony):

{% import "@AppBundle/tools.html.twig" as tools -%}
Run Code Online (Sandbox Code Playgroud)

另外,我用实际字符替换了html字符代码,当使用UTF-8作为文件编码时,这应该没问题。这样您就不必使用|raw(因为这可能会导致安全问题)。


Dan*_*sev 6

Twig 2 和 Twig 3 的更新。

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

这是一个例子:

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

{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...
Run Code Online (Sandbox Code Playgroud)

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

twig/string-extra
Run Code Online (Sandbox Code Playgroud)