使用Ruby从:冒号:中的图像创建HTML链接

使用Ruby从:冒号:中的图像创建HTML链接,html,ruby,nokogiri,Html,Ruby,Nokogiri,我有一个简单的HTML文档: 你好:微笑:! 如何将:smile:文本替换为,但保持第一个:smile:不变,以获得以下结果: 你好 我尝试了这个,但Nokogiri将我的HTML转义为纯文本: doc=Nokogiri::HTML::DocumentFragment.parse(HTML) 多克·特拉弗斯博士| 下一步,除非x.text? x、 content=x.text.gsub(':smile:','') 结束 您的意思是它返回<还是> 我建议包装CGI#unescap

我有一个简单的HTML文档:


你好:微笑:!
如何将
:smile:
文本替换为
,但保持第一个
:smile:
不变,以获得以下结果:


你好

我尝试了这个,但Nokogiri将我的HTML转义为纯文本:

doc=Nokogiri::HTML::DocumentFragment.parse(HTML)
多克·特拉弗斯博士|
下一步,除非x.text?
x、 content=x.text.gsub(':smile:','')
结束

您的意思是它返回
<
还是
>

我建议包装
CGI#unescape\uhtml
方法

试试看


我认为这可能是您想要的,它还处理两个冒号之间的字符串,如:something:并生成“something.png”

doc=Nokogiri::HTML::DocumentFragment.parse(HTML)
多克·特拉弗斯博士|
如果x.text?&&x、 内容=~/:\w+:/
x、 content=x.content.sub(/:(\w+):/,“”)
a=Nokogiri::HTML::DocumentFragment.parse(“”)
x、 添加下一个兄弟姐妹(a)
结束
结束

我的解决方案与Ku的非常相似,尽管我已经尝试通过用HTML文档片段完全替换内容文本来处理替换文本可能多次出现在源文本中的情况

doc=Nokogiri::HTML::DocumentFragment.parse(DATA.read)
多克·特拉弗斯博士|
下一步,除非x.text?
如果x.text.match(%r{:(\w+):})
替换_text=x.text.gsub(%r{:(\w+):},”)
x、 content=“”
x、 添加\u下一个\u同级替换\u文本
结束
结束

你把它弄得太难了,并且使用了
遍历
,这很慢,因为它迫使Nokogiri遍历文档中的每个节点;在一个大的页面,这是昂贵的

而是利用选择器查找所需的特定节点:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div parm=":smile:">
  Hello :smile:!
</div>
EOT

div = doc.at('div[parm=":smile:"]') 
div.inner_html = div.text.sub(/:smile:/, '<img src="smile.png">')
puts doc.to_html
需要“nokogiri”

doc=Nokogiri::HTML(谢谢!问题是新的
谢谢!请参阅我对Ku关于
添加下一个兄弟姐妹
问题的回答的评论,在文本末尾附加图像标记,而不是将其替换到正确的位置。在这种情况下,使用
添加下一个兄弟姐妹
不会影响替换文本b的定位因为我已经使用了你原来的正则表达式来完全替换整个内容文本。我明白了,那太好了!谢谢!使用
add_next_sibling
是让nokogiri正确解析内容文本中的新img标记的捷径nokogiri本身可以管理它,而无需使用CGI。我建议研究如何操作。不要使用遍历
。使用选择器和Nokogiri中的多种方法之一来定位特定节点。谢谢!属性值中的
:smile:
作为示例添加,以演示属性值应保持不变。
doc = Nokogiri::HTML::DocumentFragment.parse(html)
doc.traverse do |x|
  if x.text? && x.content =~ /:\w+:/
    x.content = x.content.sub(/:(\w+):/, '')
    a = Nokogiri::HTML::DocumentFragment.parse('<a src="'+$1+'.png">')
    x.add_next_sibling(a)
  end
end
require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div parm=":smile:">
  Hello :smile:!
</div>
EOT

div = doc.at('div[parm=":smile:"]') 
div.inner_html = div.text.sub(/:smile:/, '<img src="smile.png">')
puts doc.to_html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<div parm=":smile:">
  Hello <img src="smile.png">!
</div>
</body></html>