2

パスの最後のディレクトリを返す正規表現が必要です。

たとえば、からwww.domain.com/shop/widgets/、「ウィジェット」を返します。

私はほとんど機能する表現を持っています。

[^/].*/([^/]+)/?$ 

「ウィジェット」を返しますが、からは返しwww.domain.com/shop/widgets/ませんwww.domain.com/widgets/

また、ファイル名を含むすべての URL を無視する必要があります。それではwww.domain.com/shop/widgets/blue_widget.html一致しません。

これは、Zeus サーバー要求書き換えモジュールの場合と同様に、正規表現を使用して行う必要があります。

4

4 に答える 4

2
/^www\.example\.com\/([^\/]+\/)*([^\/]+)\/$/

これは何をしますか?

  • ドメインの通常のテキストに一致します。必要に応じてこれを調整します。
  • 任意の数のディレクトリに一致します。各ディレクトリは、スラッシュ以外の文字とそれに続くスラッシュで構成されます。
  • スラッシュ以外の文字列に一致します。
  • 入力の末尾のスラッシュに一致するため、ファイルが削除されます (ディレクトリのみがスラッシュで終わるため)。

Perl で実装:

[ghoti@pc ~] cat perltest
#!/usr/local/bin/perl

@test = (
        'www.example.com/path/to/file.html',
        'www.example.com/match/',
        'www.example.com/pages/match/',
        'www.example.com/pages/widgets/thingy/',
        'www.example.com/foo/bar/baz/',
);

foreach (@test) {
        $_ =~ m/^www\.example\.com\/([^\/]+\/)*([^\/]+)\/$/i;
        printf(">> %-50s\t%s\n", $_, $2);
}

[ghoti@pc ~] ./perltest
>> www.example.com/path/to/file.html                    
>> www.example.com/match/                               match
>> www.example.com/pages/match/                         match
>> www.example.com/pages/widgets/thingy/                thingy
>> www.example.com/foo/bar/baz/                         baz
[ghoti@pc ~] 
于 2012-04-01T15:42:38.087 に答える
1

これは一般的に機能するはずです:

/([^/.]+)/$

これは、スラッシュで終了する必要がある文字列の最後から2番目のスラッシュの後の非スラッシュ、非ピリオド文字のセットと一致します。

「フォルダ名」は最初のキャプチャグループに含まれます。

于 2012-04-01T07:06:05.783 に答える
1
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'www.domain.com/shop/widgets/';
print "$1\n" if (/\/([^\/]+)\/$/);

$_ = 'www.domain.com/shop/widgets/blue_widget.html';
print "$1\n" if (/\/([^\/]+)\/$/);'
于 2012-04-01T15:15:21.900 に答える
0

Perlの正規表現は必要ありません。Zeusが理解できる正規表現が必要です。彼らはそのPCREと呼ぶかもしれませんが、PCREでさえすべてのPerl正規表現を処理するわけではありません。

ここでの答えのほとんどは、入力として取得できるさまざまな種類のURLについて考えていないため、間違っています。

  • URLのパス部分だけを取得する
  • パス部分と照合して、必要なものを見つけます
  • ファイル名で終わるパスとそうでないパスを区別します

出発点として使用できるいくつかの例があります。私はZeusを使用せず、使用したくないので、次の部分はあなた次第です。

ZWS用のPerl拡張機能を介してPerlプログラムにリクエストを渡すことができることを読みましたが、それが必要な場合は驚きます。これに頼る必要がある場合は、URIモジュールを使用してURIを解析し、パスを抽出します。それができたら、パスをそのコンポーネントに分割します。

use URI;

my $uri = URI->new( ... ); # I don't know how Zeus passes data
my $path = $uri->path;

# undef to handle the leading /
my( undef, @parts ) = split $path, '/';

ここまで進んだら、何かをディレクトリとして認識する方法を決定する必要があります。ファイルシステム構造に直接マッピングしている場合@partsは、ディレクトリが見つかるまで要素をポップして、スキップする数を数えるだけです。

しかし、Perlプログラムに何を入れても、私はそれをやりたがっています。私は最初にゼウスのルールだけでそれを成し遂げるために本当に一生懸命努力したいと思います。これまでに持っているものを見せてください。

于 2012-04-01T20:29:20.103 に答える