2012-01-14 16 views
0

我有一個問題要解決這個URL重寫代碼URL重寫如何reconize當URL的一部分是數字或num +字

RewriteRule ^([aA-zZ0-9_-]+)/?([0-9]*)/?([A-Za-z0-9_-]*)/?([A-Za-z0-9_-]*)/?$ index.php?m=$1&r=$2&a=$3&b=$4 [QSA] 

它與這些很好地工作:(白衣和whitout結束「/ 「)

Test/1234/gotoA/gotoB/ 
Test/1234/gotoA/ 
Test/1234/ 
Test/gotoA/gotoB/ 

的問題是,當gotoA以數字爲例開始:返回

Test/123gotoA 

index.php?m=Test&r=123&a=gotoA&b= 

我該如何解決它?

回答

1

問題是您使/可選。它應該是可選的整個/(xxx)

試試這個:

RewriteRule ^([aA-zZ0-9_-]+)(?:/(\d+))?(?:/([a-zA-Z\d_-]+))?(?:/([a-zA-Z\d_-]+))?/?$ index.php?m=$1&r=$2&a=$3&b=$4 [QSA] 

如果我們把原來的正則表達式與Test/123gotoA作爲輸入,會出現以下情況:

#before first match 
regex: |^([aA-zZ0-9_-]+)/?([0-9]*)/?([A-Za-z0-9_-]*)/?([A-Za-z0-9_-]*)/?$ 
input: |Test/123gotoA 
#^
regex: ^|([aA-zZ0-9_-]+)/?([0-9]*)/?([A-Za-z0-9_-]*)/?([A-Za-z0-9_-]*)/?$ 
input: |Test/123gotoA 
# [aA-zZ0-9_-], once or more, captured: $1 is "Test" 
regex: ^([aA-zZ0-9_-]+)|/?([0-9]*)/?([A-Za-z0-9_-]*)/?([A-Za-z0-9_-]*)/?$ 
input: Test|/123gotoA 
# /?: a/is found 
regex: ^([aA-zZ0-9_-]+)/?|([0-9]*)/?([A-Za-z0-9_-]*)/?([A-Za-z0-9_-]*)/?$ 
input: Test/|123gotoA 
# [0-9], zero or more times, captured: $2 is "123" 
regex: ^([aA-zZ0-9_-]+)/?([0-9]*)|/?([A-Za-z0-9_-]*)/?([A-Za-z0-9_-]*)/?$ 
input: Test/123|gotoA 
# /?: no /, but satisified, since ? can match zero times 
regex: ^([aA-zZ0-9_-]+)/?([0-9]*)/?|([A-Za-z0-9_-]*)/?([A-Za-z0-9_-]*)/?$ 
input: Test/123|gotoA 
# [A-Za-z0-9_-], zero or more times, captured: $3 is "gotoA" 
regex: ^([aA-zZ0-9_-]+)/?([0-9]*)/?([A-Za-z0-9_-]*)|/?([A-Za-z0-9_-]*)/?$ 
input: Test/123gotoA| 
# /?: no /, but satisified, since ? can match zero times 
regex: ^([aA-zZ0-9_-]+)/?([0-9]*)/?([A-Za-z0-9_-]*)/?|([A-Za-z0-9_-]*)/?$ 
input: Test/123gotoA| 
# [A-Za-z0-9_-], zero or more times, captured: $4 is "" 
regex: ^([aA-zZ0-9_-]+)/?([0-9]*)/?([A-Za-z0-9_-]*)/?([A-Za-z0-9_-]*)|/?$ 
input: Test/123gotoA| 
# /?: no /, but satisified, since ? can match zero times 
regex: ^([aA-zZ0-9_-]+)/?([0-9]*)/?([A-Za-z0-9_-]*)/?([A-Za-z0-9_-]*)/?|$ 
input: Test/123gotoA| 
# $: satisified, since this is the end of input 
regex: ^([aA-zZ0-9_-]+)/?([0-9]*)/?([A-Za-z0-9_-]*)/?([A-Za-z0-9_-]*)/?$| 
input: Test/123gotoA| 
# end of match: success 

現在,隨着改寫正則表達式,情況就不同了:

# before first match 
regex: |^([aA-zZ0-9_-]+)(?:/(\d+))?(?:/([a-zA-Z\d_-]+))?(?:/([a-zA-Z\d_-]+))?/?$ 
input: |Test/123gotoA 
#^
regex: ^|([aA-zZ0-9_-]+)(?:/(\d+))?(?:/([a-zA-Z\d_-]+))?(?:/([a-zA-Z\d_-]+))?/?$ 
input: |Test/123gotoA 
# [aA-zZ0-9_-], one or more times, captured: $1 is "Test" 
regex: ^([aA-zZ0-9_-]+)|(?:/(\d+))?(?:/([a-zA-Z\d_-]+))?(?:/([a-zA-Z\d_-]+))?/?$ 
input: Test|/123gotoA 
# Try and find /, then one or more digits, zero or one time: match, $2 is "123" 
regex: ^([aA-zZ0-9_-]+)(?:/(\d+))?|(?:/([a-zA-Z\d_-]+))?(?:/([a-zA-Z\d_-]+))?/?$ 
input: Test/123|gotoA 
# next group: a/must be found, but the next character is "g": backtrack, $2 is now "12" 
regex: ^([aA-zZ0-9_-]+)(?:/(\d+))?|(?:/([a-zA-Z\d_-]+))?(?:/([a-zA-Z\d_-]+))?/?$ 
input: Test/12|3gotoA 
# but here again the next character is not a /: the engine must backtrak again, until: 
regex: ^([aA-zZ0-9_-]+)(?:/(\d+))?|(?:/([a-zA-Z\d_-]+))?(?:/([a-zA-Z\d_-]+))?/?$ 
input: Test|/123gotoA 
# (?:/(\d+))? is still satified, as it is optional, and $2 is now "" 
# Next group: /, followed by [a-zA-Z\d_-] one or more times, captures: $3 is "123gotoA" 
regex: ^([aA-zZ0-9_-]+)(?:/(\d+))?(?:/([a-zA-Z\d_-]+))?|(?:/([a-zA-Z\d_-]+))?/?$ 
input: Test/123gotoA| 
# Next group: same as second, but satisfied with an empty match: $4 is "" 
regex: ^([aA-zZ0-9_-]+)(?:/(\d+))?(?:/([a-zA-Z\d_-]+))?(?:/([a-zA-Z\d_-]+))?|/?$ 
input: Test/123gotoA| 
# an optional /: satisified 
regex: ^([aA-zZ0-9_-]+)(?:/(\d+))?(?:/([a-zA-Z\d_-]+))?(?:/([a-zA-Z\d_-]+))?/?|$ 
input: Test/123gotoA| 
# end of input: satisified 
regex: ^([aA-zZ0-9_-]+)(?:/(\d+))?(?:/([a-zA-Z\d_-]+))?(?:/([a-zA-Z\d_-]+))?/?$| 
input: Test/123gotoA| 
# Match 
+0

thx現在看起來很完美:D – oscurodrago 2012-01-14 15:48:58

+0

更好的方法w應該寫幾個重寫規則,這樣你的正則表達式會更簡單 – fge 2012-01-14 16:49:31