2013-02-25 30 views
0

我有這個規律的例外:定期URL解析不以@符號工作正確

(?:([^\:]*)\:\/\/)?(?:([^\:\@]*)(?:\:([^\@]*))?\@)?(?:([^\/\:]*)\.(?=[^\.\/\:]*\.[^\.\/\:]*))?([^\.\/\:]*)(?:\.([^\/\.\:]*))?(?:\:([0-9]*))?(\/[^\?#]*(?=.*?\/)\/)?([^\?#]*)?(?:\?([^#]*))?(?:#(.*))? 

1)如果解析網址:http://test.ru/long/path/file.ext?queryparam=123&more=234 - 其確定

http://viper-7.com/QNCAQu

2)如果解析URL :ftp://admin:[email protected]/long/path/file.ext - 其確定

http://viper-7.com/jkQHpP

3)但是,如果GET參數中存在[AT](@),那麼它是不正確的!

實施例:http://test.ru/long/path/file.ext?queryparam=123&[email protected]

http://viper-7.com/9qIdcj

PS。定期例外找到計算器,但不記得的話題。:(

+0

這個正則表達式做什麼? – Blender 2013-02-25 09:07:38

+0

如果你解釋任務是什麼以及表達如何完成它,你或許可以增強你的問題。這6個外部鏈接可能解釋它,但大多數用戶不會在意檢查。另外,爲什麼所有'@'都用反斜槓轉義? – 2013-02-25 09:09:33

+0

這是一個通用的表達式來解析段的鏈接。 如果您使用它來解析GET參數中的URL,則存在@字符 - 所有涉及到此角色的他認爲是FTP登錄,因爲此表達式還可以反彙編和FTP URL。 – 2013-02-25 09:13:50

回答

3

這是正確的,它失敗,因爲它是一個錯誤的URL。

URL應閱讀

http://test.ru/long/path/file.ext?queryparam=123&mail=test%40domain.com 

的,而不是。畸形[email protected]

JavaScript函數encodeURIComponent('@');是你的朋友:d

2

如果你試圖解析URL,正則表達式不是這樣。 PHP有一個名爲parse_url()的內置函數,它會將URL分成多個段,以便於訪問。更高效,更少代碼。另外,您可以進一步分解查詢段parse_str()最後,如果您想分解路徑,也可以使用pathinfo()。 PHP擁有所有這些,你只需要開始使用它們。