Rails中是否有HTML安全截断方法?

Jes*_*ugh 42 html ruby string ruby-on-rails

我在Rails中有一串HTML.我想在一定数量的字符之后截断字符串,不包括HTML标记.此外,如果拆分恰好落在开始和结束标签的中间,我想关闭打开的标签.例如;

html = "123<a href='#'>456</a>7890"
truncate_markup(html, :length => 5) --> "123<a href='#'>45</a>"
Run Code Online (Sandbox Code Playgroud)

msa*_*ler 80

常规truncate函数工作正常,只是:escape => false作为一个选项传递,以保持HTML完整.例如:

truncate(@html_text, :length => 230, :omission => "" , :escape => false)
Run Code Online (Sandbox Code Playgroud)

RubyOnRails.org

*编辑我没有非常仔细地阅读这个问题(或者根本没有TBH),所以这个答案并没有解决这个问题...这是我碰巧找到的答案,所以希望它可以帮助1或2个人: )

  • 谷歌把我带到了这里,这正是我想要的.谢谢. (3认同)

gde*_*ino 36

有两个完全不同的解决方案都具有相同的名称: truncate_html

  1. https://github.com/ianwhite/truncate_html:这是一个宝石并使用一个HTML解析器(nokogiri)
  2. https://github.com/hgmnz/truncate_html:这是您放在助手目录中的文件.它使用正则表达式,没有依赖关系.

  • 是否有任何新的宝石仍然维护并支持Rails 4? (3认同)
  • 第二个工作链接是:https://github.com/hgmnz/truncate_html (2认同)

mas*_*sta 15

你应该用CSS而不是Ruby来解决这个问题.您正在做一些影响DOM布局的事情,并且没有办法以编程方式设计一致的工作方案.

假设您的HTML解析器gem工作正常,并且您找到了大部分时间都能工作的最小公分母字符数.

如果更改字体大小或网站布局会发生什么?你必须再次重新计算字符数.

或者让我们说你的html中有这样的东西:<p><br /></p><br />这是零个字符,但是它会导致插入大量的空白文本.它甚至可能是带有太多填充或边距的标签<blockquote><code>标签,使您的布局完全失控.

或者反过来,假设你有这个3&nbsp;&#8773;&nbsp;&#955;(3≅λ)这是26个字符长,但为了显示目的它只有5个.

关键在于字符数不会告诉您在浏览器中如何呈现内容.更不用说HTML解析器是有时可能不可靠的大量代码.

这是一些很好的CSS来处理这个问题.:after伪类将在最后一行内容中添加白色淡入淡出.非常好的过渡.

body { font-size: 16px;}
p {font-size: 1em; line-height: 1.2em}
/* Maximum height math is:
   line-height * #oflines - 0.4
   the 0.4 offset is to make the cutoff  look nicer */
.lines-3{height: 3.2em;}
.lines-6{height: 6.8em;}
.truncate {overflow: hidden; position:relative}
.truncate:after{
    content:""; 
    height: 1em; 
    display: block; 
    width: 100%; 
    position:absolute;
    background-color:white; 
    opacity: 0.8; 
    bottom: -0.3em
}
Run Code Online (Sandbox Code Playgroud)

您可以根据需要添加任意数量的.lines-x类.我用过em但px也一样好.

然后将其应用于您的元素: <div class="truncate lines-3">....lots of stuff.. </div>

和小提琴:http://jsfiddle.net/ke87h/


Mar*_*ark 6

您可以使用truncate_html插件.它使用nokogirihtmlentities宝石,并完全符合插件名称的建议.