在使用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;
}
答案 0 :(得分:2)
使用URI模块。它会让你的生活更美好,默认情况下应该包含在Perl中。
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)
记录here的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