【发布时间】:2012-10-20 00:41:53
【问题描述】:
如何限制文本的长度,例如 50,并在显示中放置三个点?
{% if myentity.text|length > 50 %}
{% block td_text %} {{ myentity.text}}{% endblock %}
{%endif%}
【问题讨论】:
-
“三个点”实际上是一个称为省略号的字符。这是三个句号
...这是一个省略号…
如何限制文本的长度,例如 50,并在显示中放置三个点?
{% if myentity.text|length > 50 %}
{% block td_text %} {{ myentity.text}}{% endblock %}
{%endif%}
【问题讨论】:
... 这是一个省略号…
如果有人需要现代世界的这个,因为这个问题太老了,我会这样做:我绝对不希望最后有一个不完整的单词,因此我更喜欢按照以下步骤来做: 限制所需的字符长度,将我的文本分解成一堆用逗号或点分隔的句子数组,这取决于您的文本,删除最后一个表示不完整单词的数组,然后将这些数组连接或组合在一起,当然不要忘记将它们与我们在分解字符串时删除的那个点连接起来,并在树枝 {{}} 之外添加您的三个点,据说它看起来像这样:
{{myentity.text|slice(0,50)|split('.')|slice(0,-1)|join('.')}}...
<a href="#">readeMore</a>
【讨论】:
除了 Nemo64 在 olegkhuss 的response 下的评论,我想补充一点,如果您需要使部分文本以单词而不是字符结尾,您可以这样做:
entity.text|split(' ', 11)|length > 10 ? entty.text|split(' ', 11)|slice(0, 10)|join(' ') ~ '…' : entity.text
在此示例中,所有超过 10 个单词的文本将在第 10 个单词之后被剪切。
【讨论】:
Twig 2 和 Twig 3 的更新。
截断过滤器不可用,您可以使用u-filter代替它
这是一个例子:
{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip
{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...
注意:此过滤器是 StringExtension 的一部分,
twig/string-extra
【讨论】:
Twig\Extra\String\StringExtension: null
达到限制后使用截断过滤器截断字符串
{{ "Hello World!"|truncate(5) }} // default separator is ...
你好……
您还可以通过将第二个参数设置为 true 来告诉 truncate 保留整个单词。如果最后一个 Word 在分隔符上,则 truncate 将打印出整个 Word。
{{ "Hello World!"|truncate(7, true) }} // preserve words
你好,世界!
如果要更改分隔符,只需将第三个参数设置为所需的分隔符即可。
{{ "Hello World!"|truncate(7, false, "??") }}
你好W??
【讨论】:
这里的 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 中的“单词边界”设置不显示任何内容)。
【讨论】:
最好使用 HTML 字符
{{ entity.text[:50] }}…
【讨论】:
&#8230;。
@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) }}
注意我导入一个包含宏的 Twig 模板并将其作为“工具”导入(Symfony):
{% import "@AppBundle/tools.html.twig" as tools -%}
另外,我用实际字符替换了html字符代码,这在使用UTF-8作为文件编码时应该没有问题。这样您就不必使用|raw(因为它可能会导致安全问题)。
【讨论】:
我知道这是一个非常古老的问题,但从 twig 1.6 开始,您可以使用切片过滤器;
{{ myentity.text|slice(0, 50) ~ '...' }}
波浪号的第二部分是可选的,如果你想添加一些东西,例如省略号。
编辑:我的错,我看到投票最多的答案确实使用了切片过滤器。
【讨论】:
一个更优雅的解决方案是通过字数(而不是字符数)来限制文本。这可以防止丑陋的撕裂(例如'Stackov...')。
这是一个示例,我只缩短超过 10 个单词的文本块:
{% set text = myentity.text |split(' ') %}
{% if text|length > 10 %}
{% for t in text|slice(0, 10) %}
{{ t }}
{% endfor %}
...
{% else %}
{{ text|join(' ') }}
{% endif %}
【讨论】:
出于同样的目的,我写了这个简单的 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) }}
【讨论】:
您可以通过以下方式进行限制。第一个是起始索引,第二个是字符数。
**{{ results['text'][4:2] }}**
【讨论】:
另一个是:
{{ myentity.text[:50] ~ '...' }}
【讨论】:
为什么不使用 twig 的 truncate 或 wordwrap 过滤器?它属于twig extensions,正如我所见,lib 是 Symfony2.0 的一部分。
{{ text|truncate(50) }}
【讨论】:
...,第二个参数要设置为true 如{{ text|truncate(50, true)
require twig/extensions
{{ 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 ? '...') }}
text 之后缺少了 |length,但那是完美的,谢谢!