2012-04-01 7 views
2

パスの最後のディレクトリを返す正規表現が必要です。Zeus書き換えルールを使用してURLパスから最後のディレクトリを取得するにはどうすればよいですか?

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

私はほとんど動作する表現をしています。

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

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

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

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

+0

"ファイル名"とは何を定義しますか? – Amber

+0

'$ what_i_want =(分割"/"、$ url)[ - 1]'も答えを得るでしょう。 – Unos

+3

@freespace OPの投稿を読んだことはありますか? "これは、Zeusサーバー要求書き換えモジュールの場合のように、perl正規表現を使用して行う必要があります。 – Amber

答えて

1

これは、一般的に動作するはずです:

/([^/.]+)/$ 

それはスラッシュで終わらなければなりません文字列の最後から2番目のスラッシュの後に非スラッシュ、非周期文字のセットと一致します。

「フォルダ名」は、最初の取得グルー​​プになります。

+6

'http://www.example.com/hier/archy?f = 1&y = zz/qq#frag/ment'はどうですか?ここの最後の「フォルダ」はおそらく 'archy'です。 URLがどのように使われているかに応じて、 'qq'や' ment'でもかまいません。 –

+2

@JamesYoungman [a] OPはURLの末尾にスラッシュを使用しているようです。 [b]サーバレベルのほとんどのURL書き換えエンジン(OPが尋ねてきたもの)にはクエリ文字列が含まれておらず、サーバはフラグメントを見ていません。 [c]末尾のスラッシュを実際にオプションにしたい場合は、パターン内の最後の '/'の後に '?'を追加するだけです。 – Amber

+0

(他のアップアップされた回答のほとんどすべてが同じことをしているという事実もあり、そのほとんどはあまり効率的ではありません)。 – Amber

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 (/\/([^\/]+)\/$/);' 
+0

これは実際にOPが提示するすべてのケース(つまり、www.domain.com/shop/widgets/blue_widget.htmlおよびwww.domain.com/shop/widgets/)で機能します。 – BluesRockAddict

+0

@BluesRockAddict OPがファイル名で終わったURLと一致しないようにすることを望んでいました。 * "ファイル名を含むすべてのURLも無視する必要があります" * – Amber

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

これは何をしますか?

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

Perlで実装:

[[email protected] ~] 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); 
} 

[[email protected] ~] ./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 
[[email protected] ~] 
+0

私はこれをdownvoteしませんでしたが、www.domain.com/shop/widgets/blue_widget.htmlの場合は機能しません。 – BluesRockAddict

+0

私のために働く。 'blue_widget.html'行をインクルードすると、' file.html'の例と同じ扱いになります。つまり '$ 2'は設定されていません。どのようにテストしましたか? – ghoti

+0

申し訳ありませんghoti、私は元の質問を誤解しました。あなたの答えは正しいです。 – BluesRockAddict

0

あなたはPerlの正規表現を望んでいません。あなたはゼウスが理解する正規表現が必要です。彼らはそのPCREを呼び出すかもしれませんが、PCREでもすべてのPerl正規表現を処理しません。

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

  • は、ファイル名で終わるパスと

をそうでないものを区別

  • が必要なものを見つけるために
  • マッチパス部分に対するURLのちょうどパス部分を取得します。あなたが最初に使用できるいくつかの例があります。私はゼウスを使用していないとしたくないので、次の部分はあなた次第です:私はしました

    ZWSのPerl拡張を使ってPerlプログラムに要求を渡すことができると読んだが、もしそれが必要なら驚くだろう。それに頼らなければならない場合は、URIモジュールを使用してURIを解析し、パスを抽出します。あなたはそれにパスを分割、ことをしたらコンポーネントです:あなたがここまでしたら

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

    しかし、私はPerlプログラムに何を入れても、それをやめてくれるのです。私は最初にゼウスのルールの中でそれをやることを本当に難しくしたいと思う。あなたがこれまでに持っているものを私たちに教えてください。

  • 関連する問題