【问题标题】:Rails Truncate Method: Ignore html in a string in Length CountRails Truncate 方法:忽略长度计数中字符串中的 html
【发布时间】:2011-08-24 07:41:20
【问题描述】:

我使用截断方法截断站点中的字符串。我用代码截断:

 truncate(auto_link(textilize(post.content)), :length  => 140)

此截断会截断帖子内容,但内容包含链接存在问题。 EG帖子内容是:

 <p>Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo 
 <a href="http://www.yahoo.com">Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo 
 Yahoo </a> Google Google Google Google Google Google Google Google Google Google  <a 
 href="http://www.google.com"> Google Google Google Google Google Google Google Google 
 </a><br></p>

在这种情况下,所有 html 标签和链接都通过 truncate 方法计入字符数,而不是 truncate 方法计算查看者实际看到的字符数:

 Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo
 Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo  (etc..)

截断方法在这里有什么解决方法吗?

编辑:消除歧义的新示例:

用户以纯文本形式发布他们的帖子,并允许使用纺织品进行某些格式设置。在发布链接方面,我允许用户 (a) 粘贴纯 URL(http://www.site.com、www.site.com 等),(b) 使用可转换“点击我”的纺织语法text":http://www.example.com 到 the click me text 或花时间以 html 形式嵌入链接。

我希望一个包含某人帖子的 sn-ps 的页面仅显示他们帖子的前 140 个字符。但我希望这是读者会看到的文本的 140 个字符。换句话说,假设用户的帖子开头为:

 Today I went to the market to pick up some fruit. "At the market there was this awesome
 fruit display!":http://www.externalsite.com/picture.jpg Definitely want to go back 
 tomorrow!

这会被textilize转换成193个字符的字符串:

 Today I went to the market to pick up some fruit. <a href="http://www.externalsite.com/picture.jpg"> 
 At the market there was this awesome fruit display!</a> Definitely want to go back 
 tomorrow!

用户将在页面上看到的文本只有 138 个字符:

 Today I went to the market to pick up some fruit. At the market there was this awesome
 fruit display! Definitely want to go back tomorrow!

193 个字符的长文本将被 truncate 截断,但如果我对整个文本进行处理,将显示整个文本,最终显示为只有 138 个字符并嵌入了链接。

【问题讨论】:

  • 好吧,我想我可以删除 sn-p 的链接——从长远来看,这可能是明智的。但我现在也有兴趣学习如何解决这个问题。我正在添加 auto_link 因为我允许用户粘贴链接(例如,以纯文本形式输入“www.google.com”)并希望它暂时成为可点击的链接。我正在添加一些编辑在这个问题上也更具体。
  • 嗯好的 - 谢谢你的想法

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


【解决方案1】:

您将返回一个包含所有链接的字符串。所以截断是正确的。您需要的是通过一种方法传递内容,该方法只返回链接的文本(我猜应该截断)。

您可以为此使用正则表达式来获取链接的字符串,例如(未测试)

post.content.gsub /<a[\w\"]*>([a-z]*)<\/a>/i do |link_text|
  truncate(auto_link(link_text), :truncate => 40)
end

【讨论】:

  • post.content 是纯文本,auto_link 正在生成链接。您的正则表达式毫无意义,您仍然会产生无效的 HTML。
  • @mu 太短了谢谢你的好话,这总是鼓励我尝试和帮助。我不完全知道他在做什么,我只是假设他需要从他的链接中提取链接字符串以截断它们并提供一个未测试示例。不必自大。
  • 也许措辞不当,如果我有点粗鲁,我深表歉意;不过很好的外交回应。不过,目前这个问题相当令人困惑,将auto_link 应用于 HTML 没有多大意义。我将其解读为“post.content 是纯文本,正在自动链接然后被截断”,同一篇文章与他正在使用的内容不匹配。
  • @pduerseteler,基本上在一页上,我试图显示帖子内容的 sn-p。我允许用户使用 Textile 或 html 来嵌入链接。因此,如果嵌入了链接,我不希望 html 计入字符数,否则生成的截断帖子会显得比我想要的要短——我将添加一个更具体的编辑。跨度>
【解决方案2】:

截断包含 HTML 代码的文本不是一个好主意。

我建议你使用纯文本。否则,另一种选择是

  1. 使用auto_link
  2. 用 1 个字符的占位符替换每个链接,例如 $
  3. 截断
  4. 用旧的相应链接替换每个占位符

这是一种 hack,但它应该可以工作。同样,我建议您在截断时使用纯文本。

【讨论】:

  • 发布了一个例子。用户的帖子以纯文本开头。但我希望他们也能够发布链接。如果这些链接被嵌入,我不希望它们被计算在内。是的,看到你的黑客可能会奏效。仍在试图弄清楚是否还有其他选择。谢谢!
【解决方案3】:

对于那些感兴趣的人,要在没有链接的情况下获得准确的计数,可以这样做:

 count = strip_tags(string).count

(这是针对其中包含 html 标签的字符串。如果字符串需要先进行“textilized”等,则代码为 count = strip_tags(textilize(string)).count)。

我没有使用截断,而是将计数限制为该真实计数的 140 个字符,即将其切换为字段验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    相关资源
    最近更新 更多