2015-11-19 48 views
0

這些是我的重寫規則。第一條規則是有問題的,它是我試圖達到的目標。最後四項工作,但這是一個矯枉過正。apache中的凝結重寫規則

RewriteRule ^([^/^.]+)/([0-9]{4})([a-z]{3})([0-9]{2})/p(([0-9]{1,5})-([0-9]{1,3}))?$ /test2-$1-$2-$3-$4-$5-$6 


RewriteRule ^([^/^.]+)/([0-9]{4})([a-z]{3})([0-9]{2})/p([0-9]{1,5})-([0-9]{1,3})$ /test-$1-$2-$3-$4-$5-$6 
RewriteRule ^([^/^.]+)/([0-9]{4})([a-z]{3})([0-9]{2})/p([0-9]{1,5})-$ /test-$1-$2-$3-$4-$5 
RewriteRule ^([^/^.]+)/([0-9]{4})([a-z]{3})([0-9]{2})/p([0-9]{1,5})$ /test-$1-$2-$3-$4-$5 
RewriteRule ^([^/^.]+)/([0-9]{4})([a-z]{3})([0-9]{2})/p$ /test-$1-$2-$3-$4 

我試圖做的是使用一個重寫規則,而不是四個處理下列格式的URL:

http://example.com/word/####wor##/p#-### 
http://example.com/word/####wor##/p#- 
http://example.com/word/####wor##/p# 
http://example.com/word/####wor##/p 

有沒有什麼辦法可以凝聚我的RewriteRules只是一個替代四?

如果需要,我會在後面添加更多信息。

+0

只是爲了澄清:在你想匹配的URL中,'#'代表任何數字,'wor'可以是任何3個字母(而不僅僅是這三個,按照這個順序),但'p'應該總是匹配字母'p'? – Kay

+0

這就是正確的 – Mike

回答

0

有可能是解決這個更優雅的方式,但下面應該工作:

RewriteRule ^([^/^.]+)/([0-9]{4})([a-z]{3})([0-9]{2})/p(?:([0-9]{1})|([0-9]{1})-|([0-9]{1})-([0-9]{3})){0,1}$ /test-$1-$2-$3-$4-$5-$6-$7-$8 [L,NC] 

進行分解:

第一部分是你到目前爲止一直在做的事情。它涵蓋捕獲結果$1$4

然後是/p,後面跟着一個大組,分成幾個變化,用管道字符|分隔。此組中包含的選項之一應該匹配零次或一次(s)/p(?:...|...|...){0,1}

?:在該組的開頭表示該組作爲一個整體不應該用於捕獲,因爲您不一定要捕獲最終結果(例如它包含一個-),所以我們將堅持只捕獲相關的子組。這也意味着,在計算捕獲組時,要知道哪些變量表示您的哪些變量(如$1,$2等),則不會計算該組。

的交替搭配您的網址提供的3個變型中/p後跟別的東西:

([0-9]{1}) 
([0-9]{1})- 
([0-9]{1})-([0-9]{3}) 


注意,在你的最終結果/test-$1-$2-$3-$4-$5-$6-$7-$8不是所有的變量可能匹配的東西,取決於你的網址模式。有些可能保持空白。

+0

@Mike,這是否解決了你的問題?如果是這樣,你能接受答案,所以你的問題被標記爲已解決? – Kay