Symfony 2 twig 限制文本的长度,并放置三个点

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

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


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


{%endif%}
149649 次浏览
\{\{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text  }}

你需要 Twig 1.6

为什么不使用 twig 的截断或字幕过滤器?它属于 接发,而 lib 是 Symfony2.0的一部分。

\{\{ text|truncate(50) }}

另一个是:

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

可以通过以下方式进行限制。首先是开始索引,其次是字符数。

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

我写这个简单的 Marco 也是为了同样的目的,希望能有所帮助:

{%- macro stringMaxLength(str, maxLength) -%}
{%- if str | length < maxLength -%}
\{\{ str }}
{%- else -%}
\{\{ str|slice(0, maxLength) }}...
{%- endif -%}
{%- endmacro -%}

使用示例 # 1(输出: “ my long string here...”) :

\{\{ _self.stringMaxLength("my long string here bla bla bla la", 20) }}

使用示例 # 2(输出: “较短的字符串!”) :

\{\{ _self.stringMaxLength("shorter string!", 20) }}

一个更优雅的解决方案是通过单词的数量(而不是字符的数量)来限制文本。这可以防止难看的撕裂(例如“ Stackov...”)。

下面是一个我只缩短超过10个单词的文本块的例子:

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


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

我知道这是一个很老的问题,但从细枝1.6你可以使用片过滤器;

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

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

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

@ olegkhuss 解决方案,命名为 UTF-8省略号: \{\{(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(因为它可能会导致安全问题)。

最好使用 HTML 字符

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

新的 Drupal 8功能中的 Buggness * 启发我们编写自己的程序:

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

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

\{\{ "Hello World!"|truncate(5) }} // default separator is ...

你好..。

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

 \{\{ "Hello World!"|truncate(7, true) }} // preserve words

这里,你好,世界!

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

\{\{ "Hello World!"|truncate(7, false, "??") }}

你好?

细枝2号和细枝3号的最新情况。

截断过滤器不可用,您可以使用 U 型过滤器代替它

这里有一个例子:

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


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

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

twig/string-extra

除了 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>