我在Rails中有一串HTML。我想在一定数量的字符之后截断字符串,不包括HTML标记。此外,如果拆分恰好落在开始和结束标签的中间,我想关闭打开的标签。例如;
html = "123<a href='#'>456</a>7890"
truncate_markup(html, :length => 5) --> "123<a href='#'>45</a>"
答案 0 :(得分:80)
常规truncate
函数运行正常,只需传递:escape => false
作为保持HTML完整的选项。例如:
truncate(@html_text, :length => 230, :omission => "" , :escape => false)
*编辑我没有仔细阅读这个问题(或者根本没有TBH),所以这个答案并没有解决这个问题......这就是我碰巧找到的答案,所以希望它可以帮助1或2个人:)
答案 1 :(得分:35)
有两个完全不同的解决方案都有相同的名称:truncate_html
答案 2 :(得分:15)
你应该用CSS而不是Ruby来解决这个问题。您正在做一些影响DOM布局的事情,并且没有办法以编程方式设计一致的工作方案。
假设您的HTML解析器宝石正常工作,并且您找到了大部分时间都能工作的最小公分母字符数。
如果更改字体大小或网站布局会怎样?你将不得不重新计算字符数。
或者说你的html中有这样的内容:<p><br /></p><br />
这是零个字符,但是它会导致插入大量的空白文本。它甚至可能是<blockquote>
或<code>
标记,其填充或边距过多会使您的布局完全失控。
或反过来,假设你有3 ≅ λ
(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>
答案 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;
}