0

regex他の文字列で始まらない文字列にのみ一致する a を使用しようとしています。私が知る限り、スタック オーバーフローに関する他の質問から否定的な先読みアサーションを使用する必要があります。しかし、何らかの理由でそれが機能していないようです。次の 3 つの文字列を考えてみましょう。

/match.jpg
match.png
excludedpath/no-match.gif

最後の文字列がexcludepath/. 私が試したことは次のとおりです。

(?!excludedpath\/)(.*)\.(gif|jpg|png)$

この正規表現パターンを Apache の書き換えルールで使用したいと考えています。基本的に、次の形式でない限り、すべての画像を(これらの3つの拡張子で)ロードしたいだけですhttp://example.com/excludedpath/some-image.jpg

RewriteCond %{REQUEST_FILENAME} (?!excludedpath\/)(.*)\.(gif|jpg|png)$
RewriteRule ^(.*)$ $1 [L]

RewriteCond "/my/path/to/application/%{REQUEST_URI}" !-f
RewriteRule ^(.*)$ /index.php/$1 [L]

なぜ3つの文字列すべてにまだ一致するのか、誰でも教えてくれます:このリンクとそれを修正する方法?

4

1 に答える 1

2

これは、文字列の先頭を確認するために先読みを必要としないためです。別のアンカーを追加するだけです。

^(?!excludedpath\/)(.*)\.(gif|jpg|png)$

そうしないと、エンジンはもちろん最初のキャラクターで一致しなくなりますが(先読みが開始されるため)、2番目のキャラクターから喜んで一致しようとします。そしてもちろんxcludedpath...、ネガティブな先読みを引き立たせることはありません。

rubularの例では、最後の文字列がスラッシュで始まるため、両方のバリアントを除外する場合は、オプションのスラッシュを先読みに追加できます。

^(?!\/?excludedpath\/)(.*)\.(gif|jpg|png)$
于 2012-10-28T17:38:02.990 に答える