symfony 2 twig 限制文字长度并放三个点

Posted

技术标签:

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

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

% if myentity.text|length > 50 %

% block td_text %  myentity.text% endblock %

%endif%

【问题讨论】:

“三个点”实际上是一个称为省略号的字符。这是三个句号... 这是一个省略号 【参考方案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 字符作为省略号? 你也可以用!此评论是对该评论 ***.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,但那是完美的,谢谢!

以上是关于symfony 2 twig 限制文字长度并放三个点的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2.8 Twig_Error_Runtime Sonata 管理包

Symfony中的多个地址的一种形式 - Twig

在 Twig 中设置 Symfony 2 表单字段的默认值

从 Symfony2/Twig 中的 2 位国家代码获取翻译的国家名称?

Twig 和 Symfony2 - 找不到实体

带有 Symfony 2 的 Twig 显示 prod 和 dev 之间不同的 json 编码变量