2013-05-20 52 views
0

我試圖尋找在HTTP響應體這樣的一句話:如何在HTTP響應正文中使用正則表達式搜索短語?

>> myvar1 
<HTML> 
<HEAD> <TITLE>TestExample [Date]</TITLE></HEAD> 
</HTML> 

當我這樣做,我沒有得到任何結果:

>> myvar.scan(/<HEAD> <TITLE>TestExample [Date]<\/TITLE><\/HEAD>/) 
[] 

這裏,[Date]是一個動態變量通過循環迭代獲得它的值。

我應該在正則表達式中添加/更改什麼?

更新: 對此場景的回答是'Nokogiri'。我正在使用nokogiri在HTTP響應正文中掃描關鍵字。非常感謝。

+0

**請勿使用正則表達式來解析HTML **。你不能用正則表達式可靠地解析HTML,你將面臨悲傷和挫折。只要HTML從你的期望改變,你的代碼就會被破壞。請參閱下面的nokogiri迴應。 –

+0

@Andy萊斯特Thnx的頭。 – Sunshine

回答

5

請不要使用正則表達式解析任何HTML標記。爲了達到這個目的,將它提供給一個合適的SAX或DOM解析器並且以這種方式提取你想要的東西就更加可維護。原因是無論你制定正則表達式有多聰明,總會有你可能忘記的角落案例。

require 'nokogiri' 

response = "<HTML> <HEAD> <TITLE>TestExample [Date]</TITLE></HEAD> </HTML>" 
doc = Nokogiri::HTML(response) 


doc.css("title").text 
+3

小心使用'css('title')'。 'css'返回一個NodeSet,它就像一個Array。相反,因爲您正在搜索'title',請使用'at'或其中一個別名來返回匹配的第一個節點。 –

+0

謝謝@Bjoern。我嘗試使用Nokogiri並獲取錯誤消息。請參閱我的更新問題。 – Sunshine

+0

看起來像MOD刪除我的更新。基本上,我添加了Nokogiri檢查,一旦我的代碼運行達到doc = Nokogiri :: HTML(響應),它會失敗並出現錯誤:NoMethodError未定義的方法'空? ... 有什麼建議麼。? – Sunshine

1

這將工作

<HEAD> <TITLE>TestExample (.*?)<\/TITLE><\/HEAD> 

http://rubular.com/r/latepMqrjx

你也許並不需要具體的<HEAD> <TITLE>的東西,因爲我懷疑會有不止一個冠軍。區分大小寫和換行符也可能是一個問題。我可能會使用

/<title>TestExample (.*?)<\//im 
+0

什麼是*實際*輸入? –

+0

非常感謝。我太早了。上述兩者都返回[[「[Date]」]]。然而,我正在嘗試在響應正文中定位 - TestExample [Date] - 。它是'if'檢查的一部分 - if(不res或res.scan(TestExample [Date])) - >然後失敗,否則傳遞action。除了正則表達式,還有一點需要注意的是,'Date'實際上是一個參數,它是從循環開始,併爲每次傳遞賦值。 – Sunshine