我正在尝试沿着http://exämple.se/path
或https://ä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)
答案 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]|/)))