2012-11-27 50 views
2

我想完成一個任務,我應該寫一個Ruby正則表達式來捕獲html標籤之間的項目,但我真的被卡住了。我到處搜索過,但我只能找到關於使用html解析器和其他程序的建議,我認爲我們不允許使用,因爲我們迄今爲止只學過正則表達式。正則表達式捕獲html標籤內的多個項目

的示例文本是:

<span id="animal_display"> 
    <a href="/b/bird">Bird</a>  
    <a href="/c/cat">Cat</a> 
    <a href="/c/dog">Dog</a> 
</span> 

我試圖捕捉BirdCatDog

使用正則表達式,我能得到第一次出現:

/<span id="animal_display">.*?<[^>]+>(.*?)<\/[^>]+>.*<\/span>/m 

我可以通過這個獲得所有三個,但我希望能夠使用列表中的正則表達式,可能有超過三個項目:

/<span id="animal_display">\s*<[^>]+>\s*(.*?)<\/a>.\s*<[^>]+>\s*(.*?)<\/a>.\s*<[^>]+>\s*(.*?)<\/a>.<\/span>/ 

是否有一個更廣義的正則表達式,可以在項目數目不詳的工作嗎?任何建議將不勝感激。

+0

不要使用正則表達式來解析HTML。你的生活將會很悲傷,現在已有的工具可以爲你做。 –

回答

1

這不是一個完整的答案,但有時有毛捕獲正則表達式可以從另一個方向標本兼治簡化 - 使用split

html = '...' 
r  =/<a[^>]*>\s* | <\/a>[^<]+ /mx 
parts = html.split(r) 

parts.each { |p| puts p.inspect } 

# Output 
"<span id=\"animal_display\">    " 
"Bird" 
"" 
"Cat" 
"" 
"Dog" 
"</span>" 
+0

非常感謝!只要我在這件事上得到足夠的分數,我就會高興起來。 – SophiaAP

1

我認爲這會讓您的生活更輕鬆,方便的dom解析器。

https://www.ruby-toolbox.com/categories/html_parsing.html

我建議你檢查出紅寶石工具箱網站。

您會注意到Nokogiri是HTML解析器的首選推薦,但您應該查看hpricot。它非常好。這不是'核心'紅寶石,但它是一個常用的寶石。

0

試試這個

str.gsub(/ < /?[^>] *> /, 「」)

0

在現實生活中,我會用Nokogiri解析這個,但是你是在球場上似乎決心要教你的不正確的方式來做事,所以這是一種獲得結果的方法不使用的解析器:

首先:

x = '<span id="animal_display"> 
     <a href="/b/bird">Bird</a>  
     <a href="/c/cat">Cat</a> 
     <a href="/c/dog">Dog</a> 
    </span>' 

然後:

x.scan(/<a.*?>(.*?)<\/a>/).flatten 
=> ["Bird", "Cat", "Dog"] 

我不知道是否有創建一個正則表達式將匹配和一個返回正確的結果的方式任意數量的列表項目;可能使用subexpression calls但這非常複雜。

+0

非常感謝!只要我在這件事上得到足夠的分數,我就會高興起來。 – SophiaAP