Answers:
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text }}
您需要Twig 1.6
{{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}
。我还建议使用省略号(…
)而不是3个实点(...
)
{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
|length
在第一次之后就错过了,text
但这很完美,谢谢!
为什么不使用细枝的截断或自动换行过滤器?如我所见,它属于树枝扩展,并且lib是Symfony2.0的一部分。
{{ text|truncate(50) }}
...
地,第二参数应该被设置为true
诸如{{ text|truncate(50, true)
require twig/extensions
另一个是:
{{ myentity.text[:50] ~ '...' }}
我知道这是一个非常老的问题,但是从树枝1.6开始,您可以使用切片过滤器;
{{ myentity.text|slice(0, 50) ~ '...' }}
如果您想添加某些内容(例如省略号),则波浪号的第二部分是可选的。
编辑:不好,我看到投票最多的答案确实使用了切片过滤器。
@olegkhuss解决方案,名称为UTF-8 Elipsis:
{{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}
text
变量注入HTML 。
将@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
(因为这可能会导致安全问题)。
更为优雅的解决方案是通过单词数(而不是字符数)限制文本。这样可以防止难看的撕裂(例如“ Stackov ...”)。
这是一个示例,其中我仅缩短了超过10个单词的文本块:
{% set text = myentity.text |split(' ') %}
{% if text|length > 10 %}
{% for t in text|slice(0, 10) %}
{{ t }}
{% endfor %}
...
{% else %}
{{ text|join(' ') }}
{% endif %}
您可以按照以下方式进行限制。第一个是起始索引,第二个是字符数。
**{{ results['text'][4:2] }}**
达到限制后,使用截断过滤器截断字符串
{{ "Hello World!"|truncate(5) }} // default separator is ...
你好...
您还可以通过将第二个参数设置为true来告诉truncate保留整个单词。如果最后一个单词在分隔符上,则截断将打印出整个单词。
{{ "Hello World!"|truncate(7, true) }} // preserve words
在这里你好世界!
如果要更改分隔符,只需将第三个参数设置为所需的分隔符即可。
{{ "Hello World!"|truncate(7, false, "??") }}
你好W ??
Twig 2和Twig 3的更新。
截断过滤器不可用,您可以使用u过滤器代替它
这是一个例子:
{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip
{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...
注意:此过滤器是StringExtension的一部分,可能需要
twig/string-extra
我出于相同的目的编写了这个简单的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) }}
这里新的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中的“单词边界”设置未显示任何内容)。
最好使用HTML字符
{{ entity.text[:50] }}…
…
。
...
,这是一个省略号…