【问题标题】:Truncate a string without cut in the middle of a word in rails在rails中的单词中间截断没有剪切的字符串
【发布时间】:2012-01-03 14:50:49
【问题描述】:

如何使用 rails 3 将文本截断到最接近的位置,而不会在单词中间截断?

例如,我有字符串:

"Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum."

如果我剪它,我想这样剪:

"Praesent commodo cursus magna, vel scelerisque nisl ..."

而不是:

"Praesent commodo cursus magna, vel scelerisque nisl conse..."

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 truncate


    【解决方案1】:

    如果您将分隔符传递给 truncate 方法,它将执行自然分词而不是在单词中间截断

    这样的东西应该可以工作(如果您想要默认的 30 个字符,请将长度更改为您想要完全删除的任何内容):

    truncate("Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.", :length => 17, :separator => ' ')
    

    更多关于截断选项的信息可以在Documentation中找到

    【讨论】:

      【解决方案2】:

      截断是一个不错的选择,但如果您想要完整的单词检测,正则表达式是您的解决方案。我会推荐这样的东西:

      string.match(/^.{0,30}\b/)[0]
      

      或者你可以把它放在一个函数中

      def shorten(string, count)
        string.match(/^.{0,#{count}}\b/)[0]
      end
      

      更新

      根据Rails documentation,您可以将正则表达式传递给 truncate 方法,如下所示:

      'Once upon a time in a world far far away'.truncate(27, separator: /\s/)
      

      这两个选项都提供了比在 truncate 方法中传入空格字符更好的单词边界检测。

      【讨论】:

        【解决方案3】:

        Rails 4.2 开始,有一个名为string#truncate_words 的新ActiveSupport 方法。它会按单词数截断字符串,这样就不可能在单词中间进行剪切。

        'And they found that many people were sleeping better.'.truncate_words(5, omission: '... (continued)')
        

        返回

        "And they found that many... (continued)"
        

        【讨论】:

          猜你喜欢
          • 2019-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-09
          • 1970-01-01
          • 2019-01-03
          相关资源
          最近更新 更多