【问题标题】:symfony 2 twig limit the length of the text and put three dotssymfony 2 twig 限制文字长度并放三个点
【发布时间】:2012-10-20 00:41:53
【问题描述】:

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

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

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

{%endif%}

【问题讨论】:

  • “三个点”实际上是一个称为省略号的字符。这是三个句号... 这是一个省略号

标签: symfony twig


【解决方案1】:

如果有人需要现代世界的这个,因为这个问题太老了,我会这样做:我绝对不希望最后有一个不完整的单词,因此我更喜欢按照以下步骤来做: 限制所需的字符长度,将我的文本分解成一堆用逗号或点分隔的句子数组,这取决于您的文本,删除最后一个表示不完整单词的数组,然后将这些数组连接或组合在一起,当然不要忘记将它们与我们在分解字符串时删除的那个点连接起来,并在树枝 {{}} 之外添加您的三个点,据说它看起来像这样:

{{myentity.text|slice(0,50)|split('.')|slice(0,-1)|join('.')}}...

<a href="#">readeMore</a>

【讨论】:

  • 似乎只有在文本的前 50 个字符中没有点时才打印出“...”。
【解决方案2】:

除了 Nemo64 在 olegkhuss 的response 下的评论,我想补充一点,如果您需要使部分文本以单词而不是字符结尾,您可以这样做:

entity.text|split(' ', 11)|length > 10 ? entty.text|split(' ', 11)|slice(0, 10)|join(' ') ~ '…' : entity.text

在此示例中,所有超过 10 个单词的文本将在第 10 个单词之后被剪切。

【讨论】:

    【解决方案3】:

    Twig 2 和 Twig 3 的更新。

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

    这是一个例子:

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

    注意:此过滤器是 StringExtension 的一部分,

    twig/string-extra
    

    【讨论】:

    • 必须在 twig_extensions.yaml 中添加 Twig\Extra\String\StringExtension: null
    【解决方案4】:

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

    {{ "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??

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        最好使用 HTML 字符

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

        【讨论】:

        • 您能否为您的答案添加一些解释?为什么要使用 HTML 实体?为什么在每种情况下都将它附加到文本中,即使文本长度少于 50 个字符?
        • 嗨,如果你写三个点,它就是三个独立的点,但是“三个点”字符被称为省略号。省略号 html 实体是 &amp;#8230;
        • 为什么不使用 unicode 字符作为省略号?
        • 你也可以用!此评论是对该评论 stackoverflow.com/a/17118915/5923187 的回复,但由于我的声誉,该举动被锁定
        【解决方案7】:

        @olegkhuss 使用命名为 UTF-8 Elipsis 的解决方案: {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}

        【讨论】:

        • 请记住,此解决方案通过text 变量启用 HTML 注入。
        • @michael-zukowski 你是对的。我改变了我的解决方案。
        【解决方案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) }}
        

        注意我导入一个包含宏的 Twig 模板并将其作为“工具”导入(Symfony):

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

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

        【讨论】:

          【解决方案9】:

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

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

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

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

          【讨论】:

            【解决方案10】:

            一个更优雅的解决方案是通过字数(而不是字符数)来限制文本。这可以防止丑陋的撕裂(例如'Stackov...')。

            这是一个示例,我只缩短超过 10 个单词的文本块:

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

            【讨论】:

            • 并且不需要附加组件!!!正是我需要的,按空格分割,按单词切片,谢谢!!!
            • 像魅力一样工作
            【解决方案11】:

            出于同样的目的,我写了这个简单的 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) }}
            

            【讨论】:

              【解决方案12】:

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

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

              【讨论】:

                【解决方案13】:

                另一个是:

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

                【讨论】:

                • 唯一的问题是它总是显示点...:/我想我会选择第一个解决方案。
                • 拜托,你能分享一下关于这个 [x:x] 的文档所在的链接吗?
                • 总是有三个点...并不能真正回答问题。
                【解决方案14】:

                为什么不使用 twig 的 truncate 或 wordwrap 过滤器?它属于twig extensions,正如我所见,lib 是 Symfony2.0 的一部分。

                {{ text|truncate(50) }}
                

                【讨论】:

                • 我正在使用 Symfony 2.3 并且截断过滤器不是默认扩展的一部分。因此,我转而求助于 Manuel 的解决方案。
                • 要在 Symfony 中启用扩展,请将其添加到您的配置文件之一:gist.github.com/pschultz/f33bfff72692ca0b6916
                • 追加...,第二个参数要设置为true{{ text|truncate(50, true)
                • 实际上将第二个参数设置为 true 会使其保留整个单词。它默认添加省略号。第三个参数可以将省略号更改为您想要的任何内容。 twig-extensions.readthedocs.io/en/latest/…
                • 使用 Symfony 2.8,我必须安装这个扩展才能使用它。 require twig/extensions
                【解决方案15】:
                {{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text  }}
                

                你需要Twig 1.6

                【讨论】:

                • 这应该是答案,直到现在还在工作;)
                • 我们如何添加指向...的链接?
                • 另外,如果你想裁剪一个单词,你可以这样做:{{ text &gt; 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}。我还建议使用省略号字符 () 而不是 3 个实点 (...)
                • 短:{{ myentity.text[:50] ~ (myentity.text|length &gt; 50 ? '...') }}
                • @Nemo64 您只是在第一个 text 之后缺少了 |length,但那是完美的,谢谢!
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-12-08
                • 1970-01-01
                • 1970-01-01
                • 2017-01-14
                • 1970-01-01
                相关资源
                最近更新 更多