2013-02-25 38 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拥有所有这些,你只需要开始使用它们。