在PHP中拆分IDN URL

时间:2012-05-31 16:33:51

标签: php regex idn

我正在尝试沿着http://exämple.se/pathhttps://äxämple.se/anotherpath?foo=bar&baf=bas行开一个IDN网址,以便我得到它的组件:

[0] http(s)://
[1] äxämple.se
[2] /anotherpath?foo=bar&baf=bas

我的第一个想法是“我只会使用parse_url!”。好吧,除了它没有做IDN域名所以没有运气。

接下来我尝试了一些我自己的正则表达式技巧,但不知何故未能得到任何有用的输出(其中一些工作到一定程度,但仍然痛苦地缺乏。

最后我尝试了其他各种各样的人的正则表达式模式,但它们似乎都不适合我(工作正确=捕获任何有用的东西,一个捕获整个网址作为其“协议”部分,大多数其他我跑过去没有捕获或显然在功能上与我尝试过的相同。

当然,为什么我这样做?我想在重新拼接URL并将其存储在数据库中之前在域名上运行idn_to_ascii

那么,我在这里做错了什么?我的方法是完全错误还是有一些preg_match的魔术调用来解决我的问题?

编辑:最好我想要一个解决方案,不涉及下载其他人写的代码blob(比如说,一个名为ParseIDNUrl的自定义类,重量为100kB)

2 个答案:

答案 0 :(得分:2)

parse_url应该可以正常工作。使用PHP 5.3.4我已经能够只提取域部分:

print parse_url('http://äxämple.se/foobar', PHP_URL_HOST);

也许你需要调整编码:

print utf8_decode(parse_url('http://äxämple.se/foobar', PHP_URL_HOST));

我得到的输出是:

äxämple.se

希望有所帮助!

答案 1 :(得分:1)

对不起,我没有100%阅读你的帖子。

这是我在这里找到的正则表达式:Properly Matching a IDN URL

\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))