使用Perl进行URL正则表达式

时间:2012-03-07 14:56:02

标签: perl url

在使用Perl正则表达式将数据存储到数据库之前,我需要规范化我的URL。

以下是一些示例网址:

然而,每当我尝试下面的代码时,而不是仅仅在foo之后移除// foo//,它还会移除http://中的双斜杠。我需要将//保留在http://中,但我不需要//之后的转发foo//。我还需要删除可能出现在网址中的任何位置的所有/..//./

基本上,这个:

"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 个答案:

答案 0 :(得分:2)

使用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;
}

它应该为你清理网址。

你真的不需要sub main。在perl中它隐含着。

编辑正如@spyroboy指出的那样,这不会为您规范化网址。您仍然需要通过某种方式对部件进行标准化,但是您要对标准化做什么并不是那么清楚。

答案 1 :(得分:0)

记录hereURI模块是正确的方法。它允许您将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