2011-05-31 179 views
5

我想要一些幫助匹配以下網址。正則表達式匹配url無文件擴展名

/settings => /settings.php 
/657_46hallo => /657_46hallo.php 
/users/create => /users.php/create 
/contact/create/user => /contact.php/create/user 
/view/info.php => /view.php/info.php 
/view/readme - now.txt => /view.php/readme - now.txt 
/=> [NO MATCH] 
/filename.php => /unknown.php 
/filename.php/users/create => /unknown.php 

如果域名之後的第一個部分是結尾的文件名「.PHP」 (見最後2例),它應該重定向到/unknown.php

我想我需要2個正則表達式 1st應該幾乎是這樣的:^ /([a-zA-Z0-9 _] +)(/)?(。*)?$ 2nd捕獲直接文件名「/filename.php」或「/ filename」。 PHP /創建/用戶「 所以我可以重定向到unknown.php

我得到的第一個正則表達式幾乎適用於第一個pa RT。 ==============================================

request url: http://domain.com/user/create 
regex: ^/([a-zA-Z0-9_]+)(/)?(.*)?$ 
replace http://domain.com/$1.php$2$3 
makes: http://domain.com/user.php/create 

問題是,它也符合http://domain.com/user.php/create

如果有人能幫助我與兩個正則表達式將是巨大的。

回答

1

如果你想匹配.php案件你可以試試這個:

^\/([a-zA-Z0-9_]+)(\/)?(.*)?$ 

看到這裏的Regexr

如果你想避免這種情況下試試這個:

^/([a-zA-Z0-9_]+)(?!\.php)(?:(/)(.*)|)$ 

見這裏Regexr

(?!\.php)是一個負面展望,確保在這個地方沒有.php

+0

這似乎是要做的。 (第一個示例與regexr鏈接不同,但regexr網站上的示例正在運行:^ /([a-zA-Z0-9 _] + \。php)(/)?(。*)?$ ) – 2011-06-01 13:30:06

1

當你只有一把錘子...

雖然這可能可以用正則表達式來解決,它可能是這個職位的錯誤的工具,除非你有約束強制使用正則表達式的。

使用'/'作爲分隔符來分割字符串,查看第一個組件是否以'.php'結尾;如果是這樣,拒絕它,否則將'.php'附加到第一個組件,並使用'/'加入組件。

+1

這將被用作cherokee網絡服務器上的重寫規則。切諾基網絡服務器不允許我拆分網址,一種編程語言確實會使它更容易,但不幸的是這不是一個選項。 – 2011-05-31 20:48:27

相關問題