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

Posted

技术标签:

【中文标题】如何在 HTTP 响应正文中使用正则表达式搜索短语【英文标题】:How to use a regex search phrase in HTTP response body 【发布时间】:2013-05-15 13:56:51 【问题描述】:

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

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

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

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

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

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


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

【问题讨论】:

不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。请参阅下面的 nokogiri 回复。 @Andy Lester Thnx 提醒大家。 【参考方案1】:

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

require 'nokogiri'

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


doc.css( "title" ).text

【讨论】:

小心使用css('title')css 返回一个 NodeSet,其作用类似于一个数组。相反,因为您正在搜索 title,所以请使用 at 或其别名来返回匹配的第一个节点。 感谢@Bjoern。我现在尝试使用 Nokogiri 并收到错误消息。请查看我对问题的更新。 您可以使用 irb 来验证答案中的代码是否有效。错误在您的代码中的其他地方。请打开一个新问题。 Nokogiri 解析 HTML/XML,但不幸的是没有归结为 javascript 级别。为此,您需要选择每个脚本节点并使用正则表达式来查找您要查找的内容。这是一个讨论类似***.com/questions/14461931/…的SO。 非常感谢@BjoernRennhak 和所有响应帮助的人。【参考方案2】:

这会起作用

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

http://rubular.com/r/latepMqrjx

您可能不需要像&lt;HEAD&gt; &lt;TITLE&gt; 这样具体的东西,因为我怀疑会有多个标题。区分大小写和换行也可能是一个问题。我可能会使用

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

【讨论】:

什么是实际输入? 谢谢,对不起。我发消息太快了。以上两个都返回 [["[Date]"]]。但是,我试图在响应正文中找到 - TestExample [Date] -。它是“if”检查的一部分 - if (not res or not res.scan(TestExample [Date])) -> 然后失败操作,否则通过操作。除了正则表达式之外,这里需要注意的一件事是,这个“日期”实际上是一个参数,它从一开始就来自循环并在每次传递时分配值。 不要使用正则表达式。虽然它适用于简单的任务,但对于任何中等复杂性的东西来说它都太脆弱了,而且如果页面发生变化,它很可能会崩溃。 DOM 解析器更加健壮且更易于维护。【参考方案3】:

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

要获取&lt;title&gt; 文本,只需使用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>

【讨论】:

以上是关于如何在 HTTP 响应正文中使用正则表达式搜索短语的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 \b 的正则表达式来匹配字符串中的不同短语[重复]

如何使用正则表达式删除 std::wstring 中特定短语的所有实例?

正则表达式:匹配文本段落中除特定短语外的所有内容

如何使用 nltk 正则表达式模式来提取特定的短语块?

您可以使用 Python 正则表达式从偏移量向后搜索吗?

如何使用批处理搜索 .txt 文件中的特定短语