2015-10-06 86 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')。正在嘗試使用更可能知道的方法,但您的解決方案更好。 –