我正在尝试在HTTP响应正文中搜索这样的短语:
>> myvar1
<HTML>
<HEAD> <TITLE>TestExample [Date]</TITLE></HEAD>
</HTML>
当我这样做时,我没有得到任何结果:
>> myvar.scan(/<HEAD> <TITLE>TestExample [Date]<\/TITLE><\/HEAD>/)
[]
这里,[Date]
是一个动态变量,通过循环迭代获取其值。
我应该在正则表达式中添加/更改什么?
更新 对这种情况的回答是'Nokogiri'。我正在使用nokogiri在HTTP响应体中扫描关键字。非常感谢。
答案 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>