如何限制文字的长度,例如50,并在显示屏上放置三个点?
{% if myentity.text|length > 50 %}
{% block td_text %} {{ myentity.text}}{% endblock %}
{%endif%}
答案 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] }}…