2009-01-20 41 views
3

我想做一個正則表達式匹配並替換.htaccess文件,但我不能完全弄清楚替換位。我認爲我的比賽部分是正確的,但也許有人可以提供幫助。正則表達式匹配替換幫助

我有這個網址 - http://www.foo.com/MountainCommunities/Lifestyles/5/VacationHomeRentals.aspx

而且我試圖把它變成這個 - http://www.foo.com/mountain-lifestyle/Vacation-Home-Rentals.aspx

(MountainCommunities /生活方式)/ \ d /(。*)(。ASPX)

,然後我想我會重寫規則開始喜歡這個 -

山生活方式/ $ 2 $ 3

但我需要在這個例子中取$ 2,並重寫它以在大寫字母之間放置破折號。現在我很難過。

回答

1

我不認爲你有什麼用大寫字母做是可能的正則表達式...

你會得到更好的保持在URL中的破折號和消除在.aspx

如:http://www.foo.com/MountainCommunities/Lifestyles/5/Vacation-Home-Rentals

這需要以下規則:

^/MountainCommunities/Lifestyles/5/([^/]+)/\?([^/]+) /mountain-lifestyle/$1.aspx?$2 [I] 

這也考慮到被髮送到頁面的任何查詢字符串。

順便說一句:你如何使用.htaccess與IIS?

+1

查詢字符串不是URL的一部分路徑,因此不能在RewriteRule指令中檢查。 – Gumbo 2009-01-20 16:17:09

2

試試這個:

RewriteRule ^(([A-Z][a-z]+-)*)([A-Z][a-z]+)(([A-Z][a-z]+)+)(\.aspx)?$ /$1$3-$4 [N] 
RewriteRule ^([A-Z][a-z]+-)+[A-Z][a-z]+$ /$0.aspx [R=301] 

注意mod_rewrite的使用內部計數器檢測和避免無窮遠的循環。因此,您的網址中可能不會包含太多必須轉換的字詞(Apache < 2.1和LimitInternalRecursion directive對於Apache≥2.1,請參閱MaxRedirects option)。

1

你可以在中間位「VacationHome」上使用正則表達式「([AZ])」,用正則表達式替換「 - $ 1」 - 這會給你「-Vacation-Home-Rentals」 - 然後你可以只需切掉第一個字符,然後將URL的前半部分放在前面,並將.aspx放在最後。

0

我不認爲我完全理解你在做什麼。爲什麼你不能簡單地搜索:

http://www.foo.com/MountainCommunities/Lifestyles/5/VacationHomeRentals.aspx

,取而代之的是:

http://www.foo.com/mountain-lifestyle/Vacation-Home-Rentals.aspx

或者這是您嘗試轉換的圖案的具體示例嗎?

1

我認爲主要的正則表達式已經寫了別人,而是匹配請求名地方破折號(假設所有的文件名有三個名字駱駝套管表示ALA「VacationHomeRentals.aspx」:

RewriteRule: ^/MountainCommunities/Lifestyles/\d+/([A-Z][a-z]+)([A-Z][a-z]+)([A-Z][a-z]+)\.aspx$ /mountain-lifestyle/$1-$2-$3.aspx 

這是@Gumbo的回覆的一個限制版本,因爲我沒有機會測試他的遞歸。遞歸技術絕對是最好的和最適用於任何場景的。