2011-01-30 65 views
4

使用ruby(不是rails),我想弄清楚如何用一個字符串替換(不附加)靜態文件中的某個塊。例如,在static_file.html我要取代一切HTML註釋之間的「開始」和「結束」:用兩個標記替換文件中的內容

<p>lorem ipsum blah blah ipsum</p> 

<!--start--> 
REPLACE MULTI-LINE 
CONTENT HERE... 
<!--end--> 

<p>other stuff still here...</p> 

一些answers here的是在某個點插入文本有幫助,但不處理之間。

+0

如果您使用模板文件生成HTML內容,您可能需要查看ERB或[HAML](http://haml-lang.com/)。就個人而言,我更喜歡HAML,因爲它是一個很好的HTML簡寫。如果你需要在樣板中注入不同的內容,要麼會比搜索/替換更好。 – 2011-01-30 04:53:59

回答

4

這裏有一個函數來處理它。只是它傳遞一個文件路徑和內容的HTML註釋塊之間的替換:

只要你的註釋塊總是格式化一樣:< --start-- >和< - end-- > ,這將起作用。

def replace(file_path, contents) 
    file = File.open(file_path, "r+") 
    html = "" 

    while(!file.eof?) 
     html += file.readline 
    end 

    file.close() 

    return html.gsub(/<!--start-->(.*)<!--end-->/im, contents) 
end 
2

簡單的答案是:

str = "FOO\n\BAR\nblah \nblah BAZ\nBLOOP" 
str.gsub(/BAR.*BAZ/m,"SEE") 

我不知道這是什麼,你正在嘗試做的足夠強大。這裏的關鍵是在正則表達式結尾的'm'表示多行。如果這是模板的一些值,你可能想看看像ERB模板而不是這個gsub。另外,請注意您在正則表達式中需要轉義的內容。

+0

「REPLACE CONTENT ...」將被動態生成/更改,所以我不知道使用正則表達式替換它是什麼。 – chronon 2011-01-30 04:38:35

+0

您可以動態創建這些正則表達式:r = Regexp.new「foo。* bar」,Regexp :: MULTILINE – shawn42 2011-01-30 04:48:20

1

這是如何使用的解析器做一個簡單的例子:

require 'nokogiri' 

html = '<p>lorem ipsum blah blah ipsum</p> 

<!--start--> 
REPLACE MULTI-LINE 
CONTENT HERE... 
<!--end--> 

<p>other stuff still here...</p>' 

doc = Nokogiri.HTML(html) 
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> 
# >> <p>lorem ipsum blah blah ipsum</p> 
# >> 
# >> <!--start--> 
# >> REPLACE MULTI-LINE 
# >> CONTENT HERE... 
# >> <!--end--> 
# >> 
# >> <p>other stuff still here...</p> 
# >> </body></html> 

doc.at('//comment()/following-sibling::text()').content = "\nhello world!\n" 
puts doc.to_html 

找到評論,步進到下一text()節點和更換後它:

# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
# >> <html><body> 
# >> <p>lorem ipsum blah blah ipsum</p> 
# >> 
# >> <!--start--> 
# >> hello world! 
# >> <!--end--> 
# >> 
# >> <p>other stuff still here...</p> 
# >> </body></html> 

如果你的HTML總是很簡單,沒有pos具有破壞搜索模式的字符串的可能性,那麼您可以使用搜索/替換。

如果你檢查一下,你會發現,對於任何非平凡的HTML操作,你應該去解析器。這是因爲他們處理文檔的實際結構,所以如果文檔發生變化,解析器不會感到困惑。

+0

您的解決方案假定所有註釋都將被替換,並且不會像問題狀態那樣針對特定結構。它也似乎有點矯枉過正,因爲文本恰好是HTML。我們不打算在這裏重新整理或重新格式化整個文檔。 – Jordan 2011-01-30 04:46:11