我尝试使用类似于http://exämple.se/path或https://ä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域名,所以没什么好运气的。
接下来,我尝试了一系列我自己的正则表达式技巧,但不知何故未能获得任何有用的输出(其中一些在一定程度上有效,但仍然非常缺乏)。
最后,我尝试了其他人的regex模式,但它们似乎都不适合我(work right =捕获任何有用的东西,一个捕获整个url作为其“协议”部分,我遇到的大多数其他人没有捕获任何内容,或者在功能上与我尝试过的完全相同)。
当然,我为什么要这么做呢?我想先在域名上运行idn_to_ascii,然后再将网址拼接起来并存储到数据库中。
那么,我到底做错了什么呢?我的方法是完全错误的,还是有一些神奇的preg_match调用可以解决我的问题?
编辑:最好是我想要一个不需要下载别人写的代码的解决方案(比如,一个名为ParseIDNUrl的自定义类,重100kB)
发布于 2012-06-01 00:43:28
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-06-01 00:38:25
我很抱歉我没有100%阅读你的帖子。
下面是我可以在这里找到的正则表达式:Properly Matching a IDN URL
\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))https://stackoverflow.com/questions/10837654
复制相似问题