Регулярное выражение URL с помощью Perl - PullRequest
0 голосов
/ 07 марта 2012

Мне нужно нормализовать мой URL, прежде чем я сохраню его в базе данных с помощью регулярных выражений Perl.

Вот несколько примеров URL:

Однако всякий раз, когда я пытаюсь использовать приведенный ниже код, вместо простого удаления // после foo в foo//, он также удаляет двойной слеш в http://.Мне нужно оставить // в http://, но мне не нужен форвард // после foo//.Мне также нужно избавиться от всех /../ или /./, которые могут появиться в любом месте URL.

По сути, это:

"http://www.codeme.com:123/../foo//bar.html"

Должно стать таким:

"http://www.codeme.com/foo/"

Я очень плохо знаком с Perl. Я всегда игнорировал это и думал, что он мне никогда не понадобится, однако жизнь доказала, что я неправ.Поэтому я был бы очень признателен за вашу помощь, если вы можете привести меня на правильный путь.

sub main
{
        my $line;  
        open(FH, "test.txt");

        until(($line = <FH>) =~ /9/) {

           $line =~ tr/A-Z/a-z/;

           $line =~  s|//|/| ;

           $line =~  s|\:\d\d\d|| ; 

           $line =~  s|:80||;   

            print $line;   
        }

        close FH;
}

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Используйте модуль URI. Это сделает вашу жизнь намного лучше, и она должна быть включена в Perl по умолчанию.

http://metacpan.org/pod/URI

use URI;

my $line;  
open(FH, "test.txt");

until(($line = <FH>) =~ /9/) { 
     chomp($line); # gets rid of the newline character
     my $url = new URI($line);
     print $url->scheme,'://',$url->host,'/',$url->path;
}

Это должно очистить части URL для вас.

Также вам действительно не нужно sub main. В perl это неявно.

Редактировать Как отметил @spyroboy, это не нормализует URL для вас. Вам все еще нужно будет нормализовать детали с помощью некоторых средств, но то, что вы хотите сделать с нормализацией, не совсем ясно.

0 голосов
/ 08 марта 2012

Модуль URI, задокументированный здесь , - верный путь.Это позволяет вам разделить URL на его составные части и настроить их отдельно.Эта Perl-программа, кажется, делает то, что вам нужно

use strict;
use warnings;

use URI;

for (
    'http://www.codeme.com:80/foo/../index.php',
    'http://www.codeme.com:123/../foo//bar.html' ) {

  my $uri = URI->new($_);

  $uri->port(80);

  my @path = $uri->path_segments;
  @path = grep /[^.]/, @path;
  $path[-1] = '' if grep $path[-1] eq $_, qw/ default.htm index.php /;
  $uri->path_segments(@path);

  print $uri->canonical, "\n";
}

ВЫХОД

http://www.codeme.com/foo/
http://www.codeme.com/foo/bar.html
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...