我試圖匹配:如何重寫/ foo,/ foo /,/ foo/bar,但不是/ foofake?
http://example.com/foo
http://example.com/foo/
http://example.com/foo/bar
http://example.com/foo/bar/addditional
但不是
http://example.com/foofake
任何人都知道如何做到這一點或沒有人有這方面的任何正則表達式?
我試圖匹配:如何重寫/ foo,/ foo /,/ foo/bar,但不是/ foofake?
http://example.com/foo
http://example.com/foo/
http://example.com/foo/bar
http://example.com/foo/bar/addditional
但不是
http://example.com/foofake
任何人都知道如何做到這一點或沒有人有這方面的任何正則表達式?
我看過這個問題被問及很多時間,所以和其他地方,我只是想出了這個不錯的伎倆,並希望分享它。
這RewriteRule
正則表達式將工作:
RewriteRule ^foo/{0,1}(?![a-z])(.*)
進一步解釋說:
foo
匹配的東西以foo begening。
/{0,1}
表示必須有零或一個尾部斜線。你可能會認爲這隻會匹配/ foo或/ foo /,但這也匹配/ foofake,因爲它也在foo之後有任何尾隨斜線。
(?![a-z])
這是這個正則表達式的主要部分。這表示方括號內的內容,即[a-z]不應該在foo之後。請注意,這仍然會匹配其他字符,如/ foo + bar。閱讀更復雜的版本。
(.*)
說匹配任何東西後面的斜槓。這也可以根據需要進行優化。
這是使用相同的邏輯更復雜的版本:
foo/{0,1}(?![a-zA-Z0-9`[email protected]$%^&*()_\-\{\}\[\]\+\=\\\|:;"'>.<,'\s])(.*)$
這其中有我的鍵盤上的所有字符列入黑名單,這樣它們就不是/ foo後出現。
你可以看到在行動的迷你版在這裏:http://regexr.com?33blp
,您可以在這裏的行動找到擴展版本:http://regexr.com?33bme
我覺得這種方法有改善的範圍很廣,所以如果你發現任何瑕疵或者你找到一種方法來使它成爲awesomer,請做評論!