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


128

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

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

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

{%endif%}

4
“三个点”实际上是一个单独的字符,称为省略号。这是三个句点...,这是一个省略号
路加·考辛斯

Answers:


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

您需要Twig 1.6


这应该是答案,仍然有效;)
whalesingswee

我们如何添加到...的链接?
mburakergenc

11
此外,如果您想剪裁一个单词,可以执行以下操作:{{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}。我还建议使用省略号()而不是3个实点(...
Nemo64年

2
{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
简称

1
@ Nemo64您只是|length在第一次之后就错过了,text但这很完美,谢谢!
mtefi '18

116

为什么不使用细枝的截断或自动换行过滤器?如我所见,它属于树枝扩展,并且lib是Symfony2.0的一部分。

{{ text|truncate(50) }}

5
我正在使用Symfony 2.3,并且截断过滤器不是默认扩展的一部分。因此,我改为使用Manuel的解决方案。
maurits

8
要在Symfony中启用扩展名,请将其添加到您的配置文件之一:gist.github.com/pschultz/f33bfff72692ca0b6916
彼得

1
附加...地,第二参数应该被设置为true诸如{{ text|truncate(50, true)
Sithu

实际上,将第二个参数设置为true将使其保留整个单词。默认情况下会添加省略号。第三个参数可以将椭圆更改为所需的任何内容。twig-extensions.readthedocs.io/en/latest/…–
Beta

1
使用Symfony 2.8,我必须安装此扩展才能使用它。require twig/extensions
Beta


17

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

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

如果您想添加某些内容(例如省略号),则波浪号的第二部分是可选的。

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



8

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

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

用法示例:

{{ tools.trunc('This is the text to truncate. ', 50) }}

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

{% import "@AppBundle/tools.html.twig" as tools -%}

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


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 %}

而且没有附加需求!正是我需要的,用空格分开,按单词切成薄片,谢谢!!!
弗拉基米尔Ch

像魅力一样工作
VDarricau

2

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

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

2

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

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

你好...

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

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

在这里你好世界!

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

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

你好W ??


1

Twig 2和Twig 3的更新。

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

这是一个例子:

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

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

注意:此过滤器是StringExtension的一部分,可能需要

twig/string-extra

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) }}

0

这里新的Drupal 8功能中的Bugginess *启发了我们编写自己的代码:

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


-1

最好使用HTML字符

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

您可以在答案中添加一些解释吗?为什么要使用HTML实体?为何即使每种文本长度少于50个字符,也要在每种情况下都将其附加到文本上?
Nico Haase

嗨,如果您写三个点,那是三个单独的点,但是“三个点”字符称为省略号。省略号html实体为&#8230;
西奥阿塔利

而且为什么不对那个省略号使用unicode字符呢?
Nico Haase

您也可以使用它!此评论是一个问题的答案评论stackoverflow.com/a/17118915/5923187但此举被锁定,因为我的名气
西奥阿塔利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.