使用Perl在HTTP响应中查找特定值

时间:2013-06-09 09:07:58

标签: regex string perl parsing substring

我在Perl中有一个小脚本,HTTP POST请求

my $request =  $ua->post( $url, [ 'country' => 10, 'evalprice' => 0 ] );
my $response = $request->content;

现在我知道在回复中会出现这个部分,只出现一次

:&nbsp;<b>9570&nbsp;USD

我想只拿9570(或者不管它是什么),我不知道如何搜索

:&nbsp;<b>

然后在

之前和之前采取部分
&nbsp;USD

我想正则表达式会有所帮助,但我无法弄清楚如何在这里使用它们。

3 个答案:

答案 0 :(得分:3)

你使用正则表达式在正确的轨道上。你只需要一个表达式,因为你的字符串很简单,所以你甚至不需要一个非常复杂的表达式。

my $content =~ m/:&nbsp;<b>([.\d]+)&nbsp;USD/;
my $price = $1;

m//是匹配的运算符。我们将=~告诉Perl对变量$content执行正则表达式。我们有一个包含价格的捕获组(()),其内容将进入$1[.\d+]是一组字符。点只是一个点(您的价格可能有分数),\d表示所有数字(0 - 9)。 +表示可能有很多这些字符,但至少有一个。

答案 1 :(得分:1)

使用这样的代码(删除HTML实体很好,但可选):

use HTML::Entities;

my $content = ":&nbsp;<b>9570&nbsp;USD";
my $decoded = decode_entities($content); # replace &nbsp; to spaces
my ($price) = ($decoded =~ /<b>(\d+)\s*USD/);
print "price = $price\n";

答案 2 :(得分:1)

解析HTML的最安全方法是在适当的CPAN模块的帮助下。但是一个简单的替代方案(如果响应很简单)可能就是这样;

use strict;
use warnings;

my $str = ":&nbsp;<b>9570&nbsp;USD";

if( $str =~ m/:&nbsp;<b>(\d+)&nbsp;/ ) {
   print $1, "\n";
}

我使用了正则表达式,当找到匹配项时,该数字为$1