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

时间:2010-12-01 00:30:47

标签: html ruby-on-rails ruby string

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

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

10 个答案:

答案 0 :(得分:80)

常规truncate函数运行正常,只需传递:escape => false作为保持HTML完整的选项。例如:

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

RubyOnRails.org

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

答案 1 :(得分:35)

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

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

答案 2 :(得分:15)

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

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

如果更改字体大小或网站布局会怎样?你将不得不重新计算字符数。

或者说你的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
}

您可以根据需要添加尽可能多的.lines-x个类。我用过em但是px也一样好。

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

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

答案 3 :(得分:6)

您可以使用truncate_html插件。它使用 nokogiri htmlentities gems,完全符合插件名称的含义。

答案 4 :(得分:3)

这将帮助您不费吹灰之力

SELECT Item.BagID, Item.ItemType
FROM 
  Bag INNER JOIN 
  Item ON Bag.BagID = Item.BagID
WHERE ItemType = 'Tablet' AND ItemType = 'Laptop';

答案 5 :(得分:1)

我们在zendone.com有这个需求。问题是,当将长HTML文档(MB)截断为较短的文档(KB)时,现有的解决方案非常慢。我最终编写了一个名为truncato的Nokogiri图书馆。该库包括some benchmarks将其性能与其他库进行比较。

答案 6 :(得分:1)

您可以使用

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

答案 7 :(得分:1)

your_tagged_string.truncate(60).html_safe

答案 8 :(得分:0)

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

的帮助下完成这项工作
html = "123<a href='#'>456</a>7890"
simle_format(truncate_markup(html, :length => 5)) 

=&GT; “123 456 7890”

答案 9 :(得分:-2)

从客户端解决此问题:

查看

<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;
}