如何在HTTP响应正文中使用正则表达式搜索短语?

时间:2013-05-20 22:09:56

标签: ruby regex html-parsing

我正在尝试在HTTP响应正文中搜索这样的短语:

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

当我这样做时,我没有得到任何结果:

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

这里,[Date]是一个动态变量,通过循环迭代获取其值。

我应该在正则表达式中添加/更改什么?

更新 对这种情况的回答是'Nokogiri'。我正在使用nokogiri在HTTP响应体中扫描关键字。非常感谢。

3 个答案:

答案 0 :(得分:5)

请不要使用正则表达式解析HTML之类的标记。出于这样的目的,将它提供给适当的SAX或DOM解析器并且只是以这种方式提取你想要的东西是更加可维护的。这样做的原因是,无论你如何聪明地制定你的正则表达式,总会有你可能忘记的极端情况。

require 'nokogiri'

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


doc.css( "title" ).text

答案 1 :(得分:1)

这将有效

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

http://rubular.com/r/latepMqrjx

您可能不需要像<HEAD> <TITLE>这样具体的内容,因为我怀疑会有多个标题。区分大小写和换行也可能是个问题。我可能会用

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

答案 2 :(得分:0)

您太难了。使用Nokogiri,您可以轻松地解析和搜索HTML和/或XML。

要获取<title>文本,只需使用Nokogiri的HTML::Document#title方法:

require 'nokogiri'

doc = Nokogiri::HTML('<HTML> <HEAD> <TITLE>TestExample [Date]</TITLE></HEAD> </HTML>')
doc.title # => "TestExample [Date]"

没有正则表达式要编写或维护,只要HTML有效,它就可以正常工作。

由于您试图获取一个看起来像日期的模板,因此您可能需要重写该字符串,Nokogiri也可以使用title =来简化它:

require 'date'
require 'nokogiri'

doc = Nokogiri::HTML('<HTML> <HEAD> <TITLE>TestExample [Date]</TITLE></HEAD> </HTML>')
title = doc.title
title['[Date]'] = Date.today.to_s
doc.title = title
puts doc.to_html

# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
# >> <html> <head>
# >> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>TestExample 2020-03-18</title>
# >> </head> </html>