0

我有这个常规例外:

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

1)如果解析网址:http ://test.ru/long/path/file.ext?queryparam=123&more=234 - 没关系

http://viper-7.com/QNCAQu

2) 如果解析 url: ftp://admin:pass@server.com/long/path/file.ext -没问题

http://viper-7.com/jkQHpP

3) 但是,如果 GET 参数中存在 [AT] (@),它就不能正常工作!

示例:http ://test.ru/long/path/file.ext?queryparam=123&mail=test@domain.com

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

PS。在stackoverflow上发现常规异常,但不记得主题。:(

4

2 回答 2

3

这是正确的,它失败了,因为它是一个格式错误的 url。

网址应为

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

而不是格式错误的 test@domain.com。

javascript函数encodeURIComponent('@');是你的朋友:D

于 2013-02-25T09:13:52.673 回答
2

如果您尝试解析 URL,则 regex 不是方法。PHP 有一个名为parse_url()的内置函数,可以将 URL 分解为多个段以便于访问。更高效,更少的代码。此外,您可以使用parse_str()进一步分解查询段。最后,如果要分解路径,也可以使用pathinfo()。PHP 拥有所有这些现成的,您只需要开始使用它们。

于 2013-02-25T09:25:23.860 回答