Как извлечь несколько строк кода, используя регулярное выражение Perl? - PullRequest
1 голос
/ 25 мая 2011

Я пытаюсь извлечь все IP-адреса этого сайта: http://www.game -monitor.com /

Я хочу пересмотреть 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";
}
}
}

Ответы [ 4 ]

3 голосов
/ 25 мая 2011

Используйте модификатор /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";
    }

}
3 голосов
/ 25 мая 2011

Чтобы упростить многострочные замены, используйте /s modifier, который фактически говорит Perl, что нужно делать вид, что строка - это одна строка - даже если это не так.

см. perlre для более подробной информации.

Было бы неплохо, если бы вы использовали такой модуль, как Regexp :: Common :: net - предоставьте регулярные выражения для адресов IPv4 вместо написания собственного регулярного выражения для сопоставления ipадреса.

например попробуйте что-то вроде,

use Regexp::Common qw/net/;
while (<>) {
  print $1, "\n" if /($RE{net}{ipv4})/;
}
2 голосов
/ 25 мая 2011
#!/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";
}
1 голос
/ 25 мая 2011

Я действительно не вижу, что вы пытаетесь сделать со своим большим массивом @ips. Первое регулярное выражение уже соответствует всем IP-адресам (поскольку \d{1,3} означает «от одной до трех цифр», оно уже содержит IP-адреса, состоящие из двух цифр), поэтому вам не нужны все эти преобразования с \d{1,2}.

Единственное, что вы можете сделать, это окружить свое регулярное выражение \b якорями границы слова, чтобы убедиться, что вы не соответствуете 123.123.123.123 в 99123.123.123.12399 или чем-то в этом роде. Кроме того, вы, вероятно, знаете, что ваше регулярное выражение будет также соответствовать что-то вроде 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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...