我正在处理论坛帖子,我需要用特殊格式(包括图标等)替换用户提交的网址。用户输入可能如下:
<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等,但找不到包含第一个字符的方法。
有什么建议吗?
答案 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