2012-03-07 23 views
0

URLを正規化してからPerl正規表現を使用してデータベースに格納する必要があります。ここで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; 
} 
+1

私はあなたが達成するために探している正規化が全く明確であることはよく分かりません。 'www.codeme.com:123'は' www.codeme.com'に正規化されません。 '/../ foo // bar.html'は'/foo'に正規化されません。 '/..// foo/bar.html'は'/'に正規化されます。おそらく、あなたはそれが非標準的であるように見えるので、あなたが達成しようとしているものを精緻化しようとするべきです。 –

+0

これは本当にできません。 URLパスは実際にはファイルシステムパスではなく、ファイルに直接マップすると仮定しないでください。 HEADリクエストを行い、代わりにLocationヘッダーが何を参照しているのかを確認することができます。 –

答えて

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モジュールは正規化を行いません。 –

+0

これは、サーバーが同じコンテンツを配信する原因となる別個のURIを持つためです。 – Quentin

+0

@spyroboy OPが正規化を行うために望んでいることは、それほど明確ではありません。これにより、URLを整理して正規化するのが容易になるはずの部品に取り込むという直ちの問題が解決されます。私はそれを明確にするために投稿を編集します。 – Cfreak

0

と記載されている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"; 
} 

OUTPUT

http://www.codeme.com/foo/ 
http://www.codeme.com/foo/bar.html 
+0

私はあなたのサポートのためにすべてをありがとう私はほしいと思えばもう1つの要求 – user1254916

+0

あなたのサポートのためにすべてをありがとう。私はちょうどBorodinに特別な場合はもう1つのリクエストがあります。どうすればデフォルトのディレクトリインデックスdefualt.htmまたはindex.phpを最後に削除できますか?もう一度ありがとう。 – user1254916

+0

@ user1254916:URLの最後から特定の項目を削除するには、パスの最後の要素をチェックし、不要な場合はnull文字列に設定します。デモのために私の答えを変更しました。 – Borodin