0

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

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

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

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

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

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


我正在使用 Nokogiri 扫描 HTTP 响应正文中的关键字。

4

3 回答 3

5

请不要使用正则表达式解析任何标记,例如 HTML。出于这样的目的,将其提供给适当的 SAX 或 DOM 解析器并以这种方式提取您想要的内容会更易于维护。这样做的原因是,无论你如何巧妙地制定正则表达式,总会有你可能忘记的极端情况。

require 'nokogiri'

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


doc.css( "title" ).text
于 2013-05-20T22:26:32.823 回答
0

这将起作用

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

http://rubular.com/r/latepMqrjx

您可能不需要<HEAD> <TITLE>像我怀疑会有不止一个标题那样具体的东西。区分大小写和换行也可能是一个问题。我可能会用

/<title>TestExample (.*?)<\//im
于 2013-05-20T22:17:27.067 回答
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>
于 2020-03-19T04:27:09.667 回答