正则表达式捕获html标记内的多个项目

时间:2012-11-27 02:37:11

标签: ruby regex html-parsing

我正在尝试完成一项任务,我应该写一个Ruby正则表达式来捕获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>

我正在尝试抓取Bird Cat Dog

使用这个正则表达式,我能够第一次出现:

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

我可以用这个来获取所有三个,但我希望能够在可能包含三个以上项目的列表中使用正则表达式:

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

是否有更通用的正则表达式可以处理未指定数量的项目?任何建议将不胜感激。

4 个答案:

答案 0 :(得分:1)

我认为使用方便的dom解析器可以让您的生活更轻松。

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

我建议您查看Ruby Toolbox网站。

您会注意到Nokogiri是HTML解析器的最佳推荐,但您应该查看hpricot。这非常好。它不是'核心'红宝石,但它是一种常用的宝石。

答案 1 :(得分: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>"

答案 2 :(得分:0)

尝试这个

str.gsub(/&LT; / [^&GT;] * GT; / “”)

答案 3 :(得分: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,但这非常复杂。