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] …
【讨论】:
您能否为您的答案添加一些解释?为什么要使用 HTML 实体?为什么在每种情况下都将它附加到文本中,即使文本长度少于 50 个字符? 嗨,如果你写三个点,它就是三个独立的点,但是“三个点”字符被称为省略号。省略号 html 实体是&#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 > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text
。我还建议使用省略号字符 (…
) 而不是 3 个实点 (...
)
短: myentity.text[:50] ~ (myentity.text|length > 50 ? '...')
@Nemo64 您只是在第一个 text
之后缺少了 |length
,但那是完美的,谢谢!以上是关于symfony 2 twig 限制文字长度并放三个点的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 2.8 Twig_Error_Runtime Sonata 管理包