2011-05-25 76 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