【问题标题】:Is there an HTML safe truncate method in Rails?Rails 中是否有 HTML 安全截断方法?
【发布时间】:2011-05-18 05:40:24
【问题描述】:

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

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

【问题讨论】:

    标签: html ruby-on-rails ruby string


    【解决方案1】:

    您可以为此使用truncate_html 插件。它使用 nokogirihtmlentities gems,并完全按照插件名称的含义进行操作。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是否有任何更新的 gem 仍在维护并支持 Rails 4?
      • @RyanClark 我会选择hgmnz/truncate_html。它基于正则表达式,并且应该适用于任何 Rails 版本,只要 Ruby 版本兼容。
      • 不幸的是,hgmnz/truncate_html 删除了特殊字符。代码truncate_html('&lt;p&gt;aàáâäæãåāeèéêëēėęiîïíīįìoôöòóœøōõuûüùúū&lt;/p&gt;', :length =&gt; 10) 的预期输出为&lt;p&gt;aàáâäæãåāe&lt;/p&gt;,而不是返回&lt;p&gt;aeiou&lt;/p&gt;
      【解决方案3】:

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

      【讨论】:

      • 使用这个。
      【解决方案4】:

      您应该使用 CSS 而不是 Ruby 来解决这个问题。您正在做一些影响 DOM 布局的事情,并且无法以编程方式设计出能够始终如一地工作的解决方案。

      假设您的 HTML 解析器 gem 可以正常工作,并且您发现在大多数情况下都能正常工作的最低公分母字符数。

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

      或者假设你的 html 中有这样的内容:&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt; 那是零个字符,但是它会导致插入一大块空白文本。它甚至可能是一个&lt;blockquote&gt;&lt;code&gt; 标签,具有太多的填充或边距,从而使您的布局完全失控。

      或者反过来,假设你有这个3&amp;nbsp;&amp;#8773;&amp;nbsp;&amp;#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 也一样好。

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

      还有小提琴:http://jsfiddle.net/ke87h/

      【讨论】:

      • 这就是我在我工作的站点中解决问题的方式。当 JavaScript 可用时,我会截断末尾的字符,直到它与末尾的省略号相吻合。当一行中有很多细字符或宽字符时,在服务器端截断多个字符可能会导致锯齿状的结果。
      • 这很棒。如果您还需要去除特定元素,则可以在服务器端清理/去除 html 标签。
      • 干净多了!干得好
      【解决方案5】:

      你可以使用

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

      【讨论】:

      • 这会去掉所有的html,不是吗?
      • 添加 'separator' 参数以防止单词裁剪:truncate(html.gsub(/(]+>)/, ''), length: 5, separator: ' ')
      • 还不如使用 Rails 的 strip_tags 助手来做到这一点。
      【解决方案6】:

      从客户端解决这个问题:

      查看

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

      【讨论】:

      • 这个问题是针对 Rails 的,检查标题:“Rails 中是否有 HTML 安全截断方法?”
      【解决方案7】:

      常规的truncate 函数工作正常,只需传递:escape =&gt; false 作为选项以保持HTML 完整。例如:

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

      RubyOnRails.org

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

      【讨论】:

      • Google 把我带到了这里,这正是我想要的。谢谢。
      • 谢谢!这正是我想要的。
      • 你帮了我。报价由他们的代码显示,例如 “但是通过将转义选项设置为 false 它可以按我的意愿工作。谢谢。
      • 很酷,但是如果在截断的 HTML 上有一个打开的标签,你最终会破坏你的布局。
      【解决方案8】:

      这将帮助您,无需任何额外的努力

      raw your_string.truncate(200)
      

      【讨论】:

      • "..不包括 HTML 标记",此代码适用于 HTML
      • 很好,我像这样使用sanitize(sanitize("my text &lt;em&gt;with html&lt;/em&gt;", tags: ['h1']).truncate(150)) 第一次清理将完成丢失的标记,内部清理将删除我不需要的标签,最后截断会像 html_safe 一样截断,谢谢
      【解决方案9】:

      我们可以在 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)) 
      

      => "123 456 7890"

      【讨论】:

        【解决方案10】:
        your_tagged_string.truncate(60).html_safe
        

        【讨论】:

          猜你喜欢
          • 2012-11-25
          • 1970-01-01
          • 2023-03-10
          • 1970-01-01
          • 2010-12-15
          • 1970-01-01
          • 1970-01-01
          • 2021-03-05
          • 1970-01-01
          相关资源
          最近更新 更多