使用@符号进行常规URL解析不正确

时间:2013-02-25 09:06:33

标签: php regex

我有这个常规例外:

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

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

http://viper-7.com/QNCAQu

2)如果解析网址: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上找到常规异常,但不记得主题。:(

2 个答案:

答案 0 :(得分:3)

这是错误的,因为它是一个格式错误的网址。

网址应为

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

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

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

答案 1 :(得分:2)

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