Ruby正则表达式有助于替换子串

时间:2015-10-06 17:49:30

标签: ruby regex

我需要从

替换field_to_replace
...<div>\r\n<span field=\"field_to_replace\">\r\n<div>....

字符串中多次出现field_to_replace。我需要在它之前和之后使用标签替换此事件。

2 个答案:

答案 0 :(得分:1)

不要使用正则表达式尝试搜索或替换HTML或XML内部,除非您确保源布局不会发生变化。使用解析器进行更改非常容易,并且他们可以轻松处理对源的更改。

这将替换HTML中所有出现的字符串:

require 'nokogiri'
doc = Nokogiri::HTML::DocumentFragment.parse("<div><span field='field_to_replace'><div>")
doc.to_html # => "<div><span field=\"field_to_replace\"><div></div></span></div>"

doc.search('div span[@field]').each do |span|
  span['field'] = 'foo'
end
doc.to_html # => "<div><span field=\"foo\"><div></div></span></div>"

如果您只想替换第一个匹配项,请使用at代替search

doc = Nokogiri::HTML::DocumentFragment.parse("<div><span field=\"field_to_replace\"><div><span field='field_to_replace'></span></div></span></div>")
doc.to_html # => "<div><span field=\"field_to_replace\"><div><span field=\"field_to_replace\"></span></div></span></div>"

doc.at('div span[@field]')['field'] = 'foo'
doc.to_html # => "<div><span field=\"foo\"><div><span field=\"field_to_replace\"></span></div></span></div>"

通过定义CSS选择器,您可以快速轻松地识别节点。而且,如果您需要更多功能,则可以使用XPath代替CSS。

答案 1 :(得分:0)

简单的方法是:

str = "...<div>\r\n<span field=\"field_to_replace\">\r\n<span field=\"field_to_replace\">\r\n<div>...."
str.split("field_to_replace").join("new_field")

如果您需要更复杂的东西,请告诉我们。