0

私は一致しようとしています:

http://example.com/foo

http://example.com/foo/

http://example.com/foo/bar

http://example.com/foo/bar/addditional

だがしかし

http://example.com/foofake

誰かがこれを行う方法を知っているか、誰かがこれのための正規表現を持っていますか?

4

1 に答える 1

0

私はこの質問が何度も聞かれるのを見てきました.SOや他の場所で、私はちょうどこの素晴らしいトリックを考え出したので、それを共有したいと思います.

このRewriteRule正規表現は機能します:

RewriteRule ^foo/{0,1}(?![a-z])(.*)

さらに説明:

foofoo で始まるものに一致します。

/{0,1}末尾のスラッシュが 0 個または 1 個でなければならないことを示しています。これは /foo または /foo/ のみに一致すると考えるかもしれませんが、これは /foofake にも一致します。これは、foo の後に末尾のスラッシュがないためです。

(?![a-z])これは、この正規表現の主要部分です。これは、角括弧内のもの、つまり [az] は foo の後にあるべきではないことを示しています。これは /foo+bar などの他の文字と一致することに注意してください。より複雑なバージョンを読んでください。

(.*)末尾のスラッシュの後は何でも一致します。これは、必要に応じて最適化することもできます。

これは、同じロジックを使用したより複雑なバージョンです。

foo/{0,1}(?![a-zA-Z0-9`~!@$%^&*()_\-\{\}\[\]\+\=\\\|:;"'>.<,'\s])(.*)$

これには、キーボードのすべての文字がブラックリストに登録されているため、 /foo の後に表示されません。

ここでミニバージョンの動作を確認できます: http://regexr.com?33blp

拡張バージョンは、http: //regexr.com ?33bme で動作しています。

この方法には改善の余地がたくさんあると思いますので、何か欠陥を見つけたり、もっと素晴らしい方法を見つけた場合は、コメントしてください!

于 2013-01-09T17:28:52.307 に答える