用其他信息替换链接,如何排除

时间:2012-03-29 13:10:31

标签: ruby-on-rails ruby regex

我正在处理论坛帖子,我需要用特殊格式(包括图标等)替换用户提交的网址。用户输入可能如下:

<p>This is a link: http://www.url1.com/</p>
<p>http://www.url2.com/</p>
<p><img src="http://www.url3.com/image.jpg"> something</p>

具体来说,我需要用修改后的数据替换两个第一个链接(url1.com&amp; url2.com)(需要在代码块内修改,~30行代码)。但是,我还没有找到实现这一目标的好方法。

如果我这样做

html.gsub(/http[s]?:\/\/[^(\s|<)]+/) { |url| "REPLACED" }

我明白了:

<p>This is a link: REPLACED</p>
<p>REPLACED</p>
<p><img src="REPLACED something</p>

基本上,除了工作之外的其他一切,但是img src被错误地检测为链接。

我还试图排除链接的可能起始字符(“和',因为html事先被清理,是有效的html)。

comment.gsub(/[^\"\']http[s]?:\/\/[^(\s|<\"\')]+/) { |url| "REPLACED" }

这种作品,产生以下结果:

<p>This is a link:REPLACED</p>
<pREPLACED</p>
<p><img src="http://www.url3.com/image.jpg"> something</p>

然而,第一个(也可能是最后一个)角色丢失了。我试图在代码块中使用\ 1等,但找不到包含第一个字符的方法。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

试试以下代码,我相信你会得到所需的输出:

require 'uri'
text = '<p>This is a link: http://www.url1.com/</p>
<p>http://www.url2.com/</p>
<p><img src="http://www.url3.com/image.jpg"> something</p>'
URI.extract(text)

links =&gt; [“link:”,“http://www.url1.com/”,“http://www.url2.com/”,“http://www.url3.com/image.jpg”]

然后使用gsub将所有链接替换为'REPLACED'。

links.shift => "link :"
links.each do |link|
  text = text.gusb(link, "REPLACED")
end

和文本输出

"<p>This is a link : REPLACED</p>\n<p>REPLACED</p>\n<p><img src=\"REPLACED\"> something</p>"

希望有所帮助。

答案 1 :(得分:0)

您可能希望避免使用正则表达式进行HTML / XML抨击。试试nokogiri。见https://stackoverflow.com/a/610653/158285

<强> [UPDATE]

https://stackoverflow.com/a/2699994/158285

<强> [UPDATE]

我已将上述问题重新设计为您的问题,而且

require 'cgi'
require 'rubygems' rescue nil
require 'nokogiri'

file_path = "your_page.html"
txt =  <<-EOF
    <p>This is a link: http://www.url1.com/</p>
    <p>http://www.url2.com/</p>
    <p><img src="http://www.url3.com/image.jpg"> something</p>
EOF
doc = Nokogiri::HTML txt
doc.css("img").each do |link|
  puts link
  link.attributes["src"].value = "REPLACED"
end

puts doc.to_s

# SECOND SOLUTION

require 'uri'
rtxt = txt.gsub URI.regexp do |match|
  "REPLACED"
end
puts rtxt

答案 2 :(得分:0)

我使用rinku(https://github.com/tanoku/rinku/tree/)解决了这个问题

Rinku.auto_link(comment, :urls, 'target="_blank" rel="nofollow"') do |url|
  "parsed stuff"
end
相关问题