2016-12-24 73 views
1

我想創建一個RewriteRule來獲取路徑名URL的每個部分。RegEx htaccess - 獲取URL路徑名的每個部分

下面是一個簡單例子:

比方說,我把這個網址:

127.0.0.1/service/param1/param2/param3/param4/param5/param6

我想通過這一個轉換此調用:

127.0.0.1/index.php?s=service & P_1 =參數1 & P_2 =參數2 & P_3 =參數3 & P_4 = param4 & p_5 = param5 & pa_6 = param6

我嘗試了很多不同的正則表達式,但成功的內部消除不幸。

這裏是一個我很多信心,但它無法

RewriteRule ^(str)[/]?(.*)[/]?(.*)[/]?(.*)[/]?(.*)[/]?(.*)[/]?(.*)$ /index.php?s=$1&p_1=$2&p_2=$3&p_3=$4&p_4=$5&p_5=$6&p_6=$7 [L,NC,QSA] 

任何幫助將非常感激!

+0

這些參數是否可選? – Sumurai8

+1

幾乎可以確定沒有這樣的選項,但是您可以使用PHP輕鬆完成此操作。只需重寫規則一切到'index.php'文件,並在該PHP文件內進行拆分 – Dekel

+0

您的URL中沒有'str'。 '(服務)[/]?(。*)[/]?(。*)[/]?(。*)[/]?(。*)[/]?(。*)[/]?(。 *)$'應該這樣做。 '/'也不需要在字符類中,你可能想要'/'s和值之間的值。例如'(服務)/(。+?)/(。+?)/(。+?)/(。+?)/(。+?)/(。*)$'。 – chris85

回答

1

由於您的參數是可選的,因此您希望使整個捕獲組可選,而不僅僅是斜線。爲了實現這一點,我們可以使用非捕獲組。

RewriteRule ^([^/]+)(?:/([^/]*))?(?:/([^/]*))?(?:/([^/]*))?(?:/([^/]*))?(?:/([^/]*))?(?:/([^/]*))?(?:/([^/]*))?$ /index.php?service=$1&p1=$2&p2=$3&p3=$4&p4=$5&p5=$6&p6=$7&p7=$8 [L] 

([^/]+)捕獲服務。這不是可選的,應該始終在那裏。 [^/]部分匹配不是斜線的字符......並且我們至少匹配一個字符,並且儘可能匹配。然後我們使用(?:/([^/]*))?組來捕捉每個參數。語法?:將一個組標記爲非捕獲。內容將不會用於$x替換字符串。整個非捕獲組背後的?使其成爲可選參數。內部捕獲組將在稍後用於替換。所有替換字符串都被替換。如果特定替換組沒有匹配,則替換爲空字符串。

http://example.com/service/param1/param2/param3/這樣的網址會導致網址爲http://example.com/index.php?service=service&p1=param1&p2=param2&p3=param3&p4=&p5=&p6=&p7=

如果你想匹配超過8個可選參數,你最好將請求傳遞給一個php路由器。如果您將鍵值對用作路徑段,則this answer可能會對您有所幫助。

+0

謝謝!我知道了 ! 順便欣賞正則表達式的解釋。 – Xor