2009-09-02 40 views
2

我想使用Ruby來清理其標籤的HTML頁面。 我有原始的HTML,並希望定義一個標籤列表,例如[「跨度」,「裏」,「DIV」], 和創建的正則表達式的陣列,我可以按順序運行,這樣我有紅寶石列表流暢的正則表達式

clean_text = raw.gsub(first_regex,' ').gsub(second_regex,' ')... 

每個標籤兩個正則表達式(開始和結束) 。

我有辦法以編程方式執行此操作(即從標記數組預先構建正則表達式數組,然後在流暢模式下運行它們)?

編輯:我意識到我實際上一次問了兩個問題 - 第一個關於將標記列表轉換爲正則表達式列表,第二個關於調用正則表達式列表作爲流利。感謝您回答這兩個問題。我會盡量讓我的下一個問題爲單一主題。

+3

有你想過使用適當的xml/html解析器(例如nokogiri http://nokogiri.org/)? – 2009-09-02 16:30:06

+0

那麼,一個合適的xml/html解析器是一個更強大的解決方案,但我希望「只是文本」,願意容忍一個有點嘈雜的結果,而不必映射文檔的確切結構。 – 2009-09-03 06:05:25

回答

2

這應該會產生一個正則表達式來刪除所有的標籤。

clean_text = raw.gsub(/<\/?(#{tags.join("|")})>/, '') 

但是,你必須提高它支持與屬性的標籤(例如< A HREF = 「...」 >),目前只有簡單的刪除標記(例如<一個>)

+1

這將會天真地改善它:/<\/?(#{tags.join("|")})[^>]*>/ - 如果任何屬性值包含「>」 – 2009-09-02 16:28:36

1

假設你有一個build_regex方法打開一個標籤爲一個正則表達式,這應該這樣做:

tags = %w(span div li) 
clean_text = tags.inject(raw) {|text, tag| text.gsub build_regex(tag), ' ' } 

的注入調用傳遞每個替換成塊的下一次迭代的結果,使效果逐一在字符串上運行每個gsub。