0

我正在尝试用rails 标签替换<img>HTML 文件中的所有标签。<%= image_tag() %>

我想做的是:

doc = open("myfile.html") { |f| Hpricot(f) }
imgs = doc.search("//img") # here i got all Hpricot::Elements

imgs.each { |i|
  # fake function name !
  i.replace_by_HTML('<%= image_tag("/images/blabla.jpg") %>')
}

我需要一个函数,它将文件中的节点替换为我将传递的字符串。

< img src="/images/blalba.jpg" /> would give => <%= image_tag("/images/blabla.jpg") %>

更新:

我真的不想使用正则表达式,这就是我选择 Hpricot 的原因,因为它会为我解析 HTML,然后我可以做Element.attributes并生成image_tag包含所有属性的我。

如果我的 img 标签是这样的:

< img style="float:left;" src="images/blabla.jpg" width="30" height="30" ... />

或者

< img src=\"images/blabla.jpg\" style=\"float:left;\" width=\"30\" height=\"30\" ... />

明白了吗?我可能会解析一个包含转义斜杠的 .SQL 文件,该src属性可能在另一个属性之后,等等...

image_tag问题是我已经完成了如果我给出 an将返回我的函数Hpricot::Element,但我不知道如何在 Hpricot 文档中用我的字符串替换原始节点。

4

1 回答 1

0

您可以使用 gsub 字符串方法和正则表达式来执行此操作

doc = open("myfile.html") { |f|
  f.read().gsub(/<img src="([^"]*)".*\/>/, '<%= image_tag("\1") %>')
}

我没有安装 hpricot 但似乎(检查这个hpricot-altering)你可以在搜索的元素上使用交换方法

imgs.each { |i|
  i.swap('<%= image_tag(' + i.src + ') %>')
}
于 2010-07-09T10:57:18.517 回答