2012-03-07 50 views
0

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

下面是一些例子网址:

但是,每当我在 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; 
} 
+1

我不知道,你正在寻找实现正常化是完全清楚。 'www.codeme.com:123'没有标准化为'www.codeme.com'。 '/../ foo // bar.html'没有标准化为'/ foo'。 '/..// foo/bar.html'标准化为'/'。也许你应该尝试阐述你想要完成的事情,因为它看起来是非标准的。 – 2012-03-07 15:44:55

+0

你不能这样做。 URL路径并不是一个真正的文件系统路径,您不应该假设它直接映射到文件。您可能想要执行HEAD请求,然后查看位置标题所代表的内容。 – 2012-03-08 02:18:08

回答

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

它应该清理的URL件适合你。

另外你真的不需要sub main。在Perl中是隐含的。

编辑正如@ spyroboy指出的那样,这将不会标准化你的URL。你仍然需要通过一些手段来标准化这些部分,但是你想用标准化来做什么并不是那么清楚。

+0

不幸的是,URI模块没有做任何规范化。 – 2012-03-07 15:34:52

+0

这是因为您具有不同的URI,导致服务器提供相同的内容。 – Quentin 2012-03-07 15:43:06

+0

@spyroboy OP想要规范化的内容并不是那么清楚。这解决了清理URL并将其分解成部分应该更容易规范化的问题。我会编辑我的帖子以澄清这一点。 – Cfreak 2012-03-07 15:58:57

0

URI模块,记录here,是正确的路要走。它允许您将网址分成不同的组成部分并分别进行调整。这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 
+0

谢谢大家的支持,如果我想 – user1254916 2012-03-08 12:08:59

+0

谢谢大家的支持。如果特别向鲍罗廷请求,我还有一个要求。我如何删除默认目录索引defualt.htm或最后的index.php。再一次非常感谢你。 – user1254916 2012-03-08 12:16:20

+0

@ user1254916:从URL的末尾删除特定项目,只检查路径的最后一个元素,如果不需要,则将其设置为空字符串。我修改了我的答案来证明。 – Borodin 2012-03-08 17:14:34