2009-09-02 73 views
2

我想使用Ruby来清理其标签的HTML页面。 我有原始的HTML,并希望定义一个标签列表,例如[“跨度”,“里”,“DIV”], 和创建的正则表达式的阵列,我可以按顺序运行,这样我有红宝石列表流畅的正则表达式

clean_text = raw.gsub(first_regex,' ').gsub(second_regex,' ')... 

每个标签两个正则表达式(开始和结束) 。

我有办法以编程方式执行此操作(即从标记数组预先构建正则表达式数组,然后在流畅模式下运行它们)?

编辑:我意识到我实际上一次问了两个问题 - 第一个关于将标记列表转换为正则表达式列表,第二个关于调用正则表达式列表作为流利。感谢您回答这两个问题。我会尽量让我的下一个问题为单一主题。

+3

有你想过使用适当的xml/html解析器(例如nokogiri http://nokogiri.org/)? – 2009-09-02 16:30:06

+0

那么,一个合适的xml/html解析器是一个更强大的解决方案,但我希望“只是文本”,愿意容忍一个有点嘈杂的结果,而不必映射文档的确切结构。 – 2009-09-03 06:05:25

回答

2

这应该会产生一个正则表达式来删除所有的标签。

clean_text = raw.gsub(/<\/?(#{tags.join("|")})>/, '') 

但是,你必须提高它支持与属性的标签(例如< A HREF = “...” >),目前只有简单的删除标记(例如<一个>)

+1

这将会天真地改善它:/<\/?(#{tags.join("|")})[^>]*>/ - 如果任何属性值包含“>” – 2009-09-02 16:28:36

1

假设你有一个build_regex方法打开一个标签为一个正则表达式,这应该这样做:

tags = %w(span div li) 
clean_text = tags.inject(raw) {|text, tag| text.gsub build_regex(tag), ' ' } 

的注入调用传递每个替换成块的下一次迭代的结果,使效果逐一在字符串上运行每个gsub。