私は一致しようとしています:
http://example.com/foo
http://example.com/foo/
http://example.com/foo/bar
http://example.com/foo/bar/addditional
だがしかし
http://example.com/foofake
誰かがこれを行う方法を知っているか、誰かがこれのための正規表現を持っていますか?
私はこの質問が何度も聞かれるのを見てきました.SOや他の場所で、私はちょうどこの素晴らしいトリックを考え出したので、それを共有したいと思います.
このRewriteRule
正規表現は機能します:
RewriteRule ^foo/{0,1}(?![a-z])(.*)
さらに説明:
foo
foo で始まるものに一致します。
/{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 で動作しています。
この方法には改善の余地がたくさんあると思いますので、何か欠陥を見つけたり、もっと素晴らしい方法を見つけた場合は、コメントしてください!