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

时间:2012-10-30 16:00:57

标签: symfony twig

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

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

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

{%endif%}

13 个答案:

答案 0 :(得分:179)

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

您需要Twig 1.6

答案 1 :(得分:99)

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

{{ text|truncate(50) }}

答案 2 :(得分:35)

另一个是:

{{ myentity.text[:50] ~ '...' }}

答案 3 :(得分:13)

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

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

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

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

答案 4 :(得分:8)

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

答案 5 :(得分:5)

更优雅的解决方案是将文字数量限制为单词数量(而不是字符数)。这可以防止丑陋的撕裂(例如' Stackov ......')。

这是一个例子,我只缩短超过10个字的文本块:

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

{% if text|length > 10 %} 
    {% for t in text|slice(0, 10) %}
        {{ t }} 
    {% endfor %}
    ...
{% else %}
    {{ text|join(' ') }}
{% endif %}

答案 6 :(得分:4)

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

答案 7 :(得分:3)

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

**{{ results['text'][4:2] }}**

答案 8 :(得分:3)

更新Twig 2和Twig 3。

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

这是一个示例:

bli-base

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

可能需要
{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip

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

答案 9 :(得分:1)

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

答案 10 :(得分:0)

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

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

在这个例子中,所有超过 10 个单词的文本都会在第 10 个单词之后被剪切。

答案 11 :(得分:0)

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

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

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

答案 12 :(得分:-1)

最好使用HTML字符

{{ entity.text[:50] }}&#8230;