2015-10-06 84 views
-3

我需要从红宝石正则表达式的帮助,以取代串

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

更换field_to_replace有字符串中的field_to_replace多次出现。我只需要在它之前和之后使用标签替换这种情况。

+1

哦,我的,这个问题再次。好的,不要使用正则表达式,因为它会非常脆弱并且可能会破坏,特别是如果您不拥有HTML生成器。唯一需要考虑的是_EXTREMELY_简单的HTML/XML。相反,[使用解析器](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)。 Ruby最常用的是[Nokogiri](http://nokogiri.org)。互联网上有很多例子,Stack Overflow解释了如何做到这一点。 –

+0

好的,谢谢@theTinMan – Rubyman

回答

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

通过定义CSS选择器可以快速方便地识别节点。而且,如果您需要更强大的功能,那么可以使用XPath代替CSS。

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") 

让我们知道,如果你需要更复杂的东西。

+0

这可以用一个'gsub'完成。 – sawa

+0

同意,str.gsub('field_to_replace','new_field')。正在尝试使用更可能知道的方法,但您的解决方案更好。 –