2

我正在尝试按照http://exämple.se/pathhttps://äxämple.se/anotherpath?foo=bar&baf=bas这样的方式获取 IDN URL,以便我得到它的组件,如下所示:

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

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

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

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

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

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

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

4

2 回答 2

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

希望有帮助!

于 2012-05-31T16:43:27.967 回答
1

很抱歉我没有百分百阅读你的帖子。

这是我可以在这里找到的正则表达式:正确匹配 IDN URL

\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
于 2012-05-31T16:38:24.600 回答