2011-05-25 36 views
1

我想提取所有IP地址的关闭此网站:http://www.game-monitor.com/如何使用Perl正则表达式提取多行代码?

我想正则表达式的IP在该网页上,提取所有这些,在屏幕上显示出来。

这是我到目前为止,你能告诉我什么是错误的,并帮助我吗?

#!/usr/bin/perl 

use HTTP::Request; 
use LWP::UserAgent; 

print 'Press [1] To Begin: '; 
chomp ($begin = <STDIN>); 

my $url = 'http://www.game-monitor.com/'; 
my @ips = ('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}','\d{1,3}\.\d{1,2}\.\d{1,3}\.\d{1,2}','\d{1,2} \.\d{1,3}\.\d{1,2}\.\d{1,3}','\d{1,2}\.\d{1,2}\.\d{1,2}\.\d{1,3}','\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,2}','\d{1,3}\.\d{1,3}\.\d{1,2}\.\d{1,2}','\d{1,2}\.\d{1,2}\.\d{1,3}\.\d{1,3}','\d{1,2}\.\d{1,2}\.\d{1,2}\.\d{1,2}','\d{1,2}\.\d{1,3}\.\d{1,3}\.\d{1,2}','\d{1,3}\.\d{1,2}\.\d{1,2}\.\d{1,3}'); 

if ($begin eq 1) 
{ 
my $request = HTTP::Request->new(GET => $url); 
my $useragent = LWP::UserAgent->new(); 
my $response = $useragent->request($request); 
my $result = $response->content; 

foreach $ip (@ips) 
{ 
if ($result =~ /($ips[0])/ || 
$result =~ /($ips[1])/ || 
$result =~ /($ips[2])/ || 
$result =~ /($ips[3])/ || 
$result =~ /($ips[4])/ || 
$result =~ /($ips[5])/ || 
$result =~ /($ips[6])/ || 
$result =~ /($ips[7])/ || 
$result =~ /($ips[8])/ || 
$result =~ /($ips[9])/ 
) 
{ 
    print "IP: $1 \n"; 
    print "IP: $2 \n"; 
    print "IP: $3 \n"; 
    print "IP: $4 \n"; 
    print "IP: $5 \n"; 
    print "IP: $6 \n"; 
    print "IP: $7 \n"; 
    print "IP: $8 \n"; 
    print "IP: $9 \n"; 
    print "IP: $10 \n"; 
} 
} 
} 
+0

你有什么问题?你遇到了什么错误? – 2011-05-25 07:31:40

回答

2
#!/usr/bin/perl 

use HTTP::Request; 
use LWP::UserAgent; 


my $url = 'http://www.game-monitor.com/'; 
my $request = HTTP::Request->new(GET => $url); 
my $useragent = LWP::UserAgent->new(); 
my $response = $useragent->request($request); 
my $result = $response->content; 

@m = ($result =~ /\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/sg); 
foreach (@m) { 
     print "IP: $_\n"; 
} 
+0

我执行了这段代码,但没有结果?是否需要一段时间才能提取IP? – n0de 2011-05-25 07:51:57

+1

它适用于我。可能是远程网站很慢。 – 2011-05-25 11:03:04

+0

没想到我得到它的工作!谢谢! – n0de 2011-05-25 18:14:44

3

为了简化多行替换,使用/s modifier,这实际上告诉Perl假装字符串是单行 - 即使它不是。

查看perlre了解更多详情。

如果你使用像Regexp::Common::net这样的模块会很好 - 为IPv4地址提供正则表达式,而不是为匹配的IP地址编写自己的正则表达式。

例如你可以试试,

use Regexp::Common qw/net/; 
while (<>) { 
    print $1, "\n" if /($RE{net}{ipv4})/; 
} 
+0

在这种情况下,我没有看到's'修饰符的好处。这里需要'g'来匹配所有的事件。 – stema 2011-05-25 07:44:12

+0

+1 for'正则表达式::普通' – Toto 2011-05-25 07:45:58

1

我实在不明白你想与你的大阵@ips做什么。第一个正则表达式已经匹配所有的IP地址(因为\d{1,3}表示“一到三位数字”,它已经包含有两位数字的IP地址),所以你不需要\d{1,2}的所有这些排列。

你可以做的一件事是用\b字边界锚来包围你的正则表达式,以确保你在99123.123.123.12399或类似的东西中不匹配123.123.123.123。此外,你可能知道你的正则表达式也会匹配999.999.999.999之类的东西。如果这不是问题,因为你的输入不会包含无效的IP地址,那当然这很好。

最后,您需要/g全局修饰符,以便您的正则表达式不仅查找字符串中的第一个但是所有的事件。

从本质上说,如何做这样的:

while ($result =~ m/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g) { 
    print "IP: $&\n"; 
} 
+0

我执行了这段代码,但没有结果?是否需要一段时间才能提取IP? – n0de 2011-05-25 07:52:06

+0

您可以在您的问题中发布($的摘要)'$ result',以便我们可以看到它包含的内容吗? – 2011-05-25 07:53:48

+0

当我说'没有结果'时,我的意思是没有任何东西出现在屏幕上,只是一个闪烁的股票;没有什么是错误的$结果大声笑。 – n0de 2011-05-25 07:57:44

3

使用/g修改,以匹配所有的IP。 提示:使用-w参数和strict包避免“错误的编码风格”。

#!/usr/bin/perl -w 

use strict; 
use HTTP::Request; 
use LWP::UserAgent; 

print 'Press [1] To Begin: '; 
chomp (my $begin = <STDIN>); 

my $url = 'http://www.game-monitor.com/'; 
my $ip_regex = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'; 

if ($begin eq 1) 
{ 
    my $request = HTTP::Request->new(GET => $url); 
    my $useragent = LWP::UserAgent->new(); 
    my $response = $useragent->request($request); 
    my $result = $response->content; 

    while ($result =~ /($ip_regex)/g) 
    { 
     print "IP: $1 \n"; 
    } 

} 
+1

+1 for'use strict' – 2011-05-25 07:42:10

+0

我执行了这段代码,但没有结果?是否需要一段时间才能提取IP? – n0de 2011-05-25 07:51:49

+0

对我来说,它的工作......我得到约。 100个IP地址作为回报。你有任何错误消息? – arnep 2011-05-25 07:59:43