2010-07-12 50 views
0

我正在爲我的網站使用一些HTML,基本上將我的網站從PHP移動到Rails。Ruby解析CSS文件的HTML

我有成千上萬的頁面,網站的某些部分有不同的CSS文件。

我可以抓住<link>標籤罰款,但我說,如果是將要加載不同的樣式一些條件IE6/IE7/IE8等

我試圖找出如何解析這個:

<!--[if lt IE 7]> 
<link type="text/css" rel="stylesheet" media="all" href="/templates/default/css/ie6.css" /> 
<![endif]--> 
<!--[if IE 7]> 
<link type="text/css" rel="stylesheet" media="all" href="/templates/default/css/ie7.css" /> 
<![endif]-->  
<!--[if IE 8]> 
<link type="text/css" rel="stylesheet" media="all" href="/templates/default/css/ie8.css" /> 
<![endif]--> 

而且結了:

/templates/default/css/ie6.css<br /> 
/templates/default/css/ie7.css<br /> 
/templates/default/css/ie8.css<br /> 

我使用引入nokogiri拉我需要的任何其他信息,卻無法獲得這些URL由於他們是WRA在評論中發表了意見。

回答

2

Nokogiri文檔意味着它會在文檔中創建代表註釋的節點(http://nokogiri.org/Nokogiri/XML/Comment.html),如果您可以獲取這些節點的內容,那麼您可以使用簡單的RegExp來提取URL。

喜歡的東西:

/<link[^>]*?href="([^"]+)"/ 
+0

這是沒有必要使用正則表達式。 Nokogiri可以提供一個乾淨的,無正則表達式的解決方案,允許您獲取任意深度嵌套的標籤。解決方案中的正則表達式在解析HTML或XML時受到正則表達式始終表現出的相同弱點的影響。它並不是這項工作的正確工具,如果你的HTML不是微不足道的話,就會導致這種模式發展。看我的答案,看看如何。 – 2012-02-07 20:40:17

+0

@田文:很酷。更好的解決方案。 – 2012-02-08 14:05:00

0

很肯定

/href="(.+).css"/i 

將做工精細

+0

這是工作發現,但我想抓住評論之間的CSS文件,只有那些。 – RailsSon 2010-07-12 14:08:36

2

您要引入nokogiri可以得到你。問題是comment節點的內容是文本,因此您必須重新解析該文本才能繼續使用Nokogiri的juju。

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<!--[if lt IE 7]> 
<link type="text/css" rel="stylesheet" media="all" href="/templates/default/css/ie6.css" /> 
<![endif]--> 
<!--[if IE 7]> 
<link type="text/css" rel="stylesheet" media="all" href="/templates/default/css/ie7.css" /> 
<![endif]-->  
<!--[if IE 8]> 
<link type="text/css" rel="stylesheet" media="all" href="/templates/default/css/ie8.css" /> 
<![endif]--> 
EOT 

puts doc.search('//comment()').map{ |c| 
    Nokogiri::HTML::DocumentFragment.parse(c.content).at('link')['href'] 
} 

,輸出:

/templates/default/css/ie6.css 
/templates/default/css/ie7.css 
/templates/default/css/ie8.css