如何将“<p> A </p>,<p> B </p>,<p> C </p>”转换为数组?

时间:2014-10-23 02:39:30

标签: html ruby regex

我想将<p>A</p>,<p>B</p>,<p>C</p>转换为如下数组:

["A","B", "C"]

我试过了.scan(/(<p>)(.*?)(<\/p>)/i)。什么是Ruby中最方便/最健壮的方式,具有更高的容错能力?

3 个答案:

答案 0 :(得分:4)

在字符串片段上使用正则表达式

如果你知道你的HTML标签总是小写,并且你的段落主体总是大写,那么这将有效:

"<p>A</p>,<p>B</p>,<p>C</p>".scan /\p{Upper}/
#=> ["A", "B", "C"]

但它会很脆弱。这当然适用于您发布的语料库。

在您的HTML片段上使用Nokogiri

由于您有一个HTML片段,因此您应该使用解析器。例如:

require 'nokogiri'

doc = Nokogiri::HTML::DocumentFragment.parse "<p>A</p>,<p>B</p>,<p>C</p>"
doc.xpath(?p).map &:text
#=> ["A", "B", "C"]

除非你的输入是真正的病态,否则即使输入变化,Nokogiri也会从段落标记中可靠地提取文本节点,并且会忽略节点外部的无关字符,例如字符串片段中的逗号。

答案 1 :(得分:0)

尝试这样的事情:

"<p>A</p>,<p>B</p>,<p>C</p>".gsub(/<p>|<\/p>/,'').split(',')

这将删除<p></p>并将结果字符串拆分为数组

答案 2 :(得分:0)

在编辑正则表达式后删除<p>标记周围的括号,然后展平结果,我得到了你想要的输出。

"<p>A</p>,<p>B</p>,<p>C</p>".scan(/<p>(.*?)<\/p>/i).flatten

这会产生["A", "B", "C"]

http://ideone.com/bfDtGc