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

我有一个Rails的HTMLstring。 我想截断一定数量的字符(不包括HTML标记)之后的string。 另外,如果拆分恰好落在打开和closures标签的中间,我想closures打开的标签。 例如;

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

有两个完全不同的解决scheme,同名: truncate_html

  1. https://github.com/ianwhite/truncate_html :这是一个gem,并使用一个HTMLparsing器(nokogiri)
  2. https://github.com/hgmnz/truncate_html :这是你把你的助手目录中的文件。 它使用正则expression式,并没有依赖关系。

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

 truncate(@html_text, :length => 230, :omission => "" , :escape => false) 

RubyOnRails.org

*编辑我没有仔细阅读这个问题(或在所有的TBH),所以这个答案不能解决这个问题…这是我正在寻找的答案,但希望它可以帮助1或2人: )

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

比方说,让你的HTMLparsing器gem工作,你会发现一个最常见的分母字符计数,大多数时候会工作。

如果更改字体大小或网站布局,会发生什么情况? 你将不得不重新计算字符数。

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

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

关键是字符数不会告诉你如何在浏览器中呈现的东西。 更不用说事实上HTMLparsing器是一堆有时可能不可靠的代码。

这是一些很好的CSS来处理这个问题。 在伪类之后,会为最后一行内容添加一个白色渐变。 非常好的过渡。

 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 } 

您可以根据需要添加尽可能多的.lines-x类。 我用EM,但PX是一样好。

然后把这个应用到你的元素: <div class="truncate lines-3">....lots of stuff.. </div>

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

你可以使用truncate_html插件。 它使用nokogirihtmlentitiesgem,并完全按照插件名称的build议。

这将帮助你没有任何额外的努力

 raw your_string.truncate(200) 

我们在zendone.com有这个需求。 问题是现有解决scheme在将较长的HTML文档(MB)截短为较短的文档(KB)时速度非常慢。 我最终编写了一个名为truncato的基于Nokogiri的图书馆。 该库包含一些比较其性能与其他库的基准 。

您可以使用

 truncate(html.gsub(/(<[^>]+>)/, ''), 5) 

从客户端解决这个问题:

查看

 <script> $(function() { $('.post-preview').each(function() { var tmp_height = $(this).innerHeight(); if ((tmp_height > 100) && (tmp_height < 200)) { $(this).addClass("preview-small"); } else if (tmp_height >= 200) { $(this).addClass("preview-large") } else { //do nothing } }); }); </script> 

CSS

 .preview-small { height: 100px; overflow: hidden; } .preview-large { height: 200px; overflow: hidden; } 

我们可以使用simple_format http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-imple_format

 html = "123<a href='#'>456</a>7890" simle_format(truncate_markup(html, :length => 5)) 

>“123 456 7890”