【问题标题】:Splitting up an IDN URL in PHP在 PHP 中拆分 IDN URL
【发布时间】:2012-05-31 16:33:51
【问题描述】:

我正在尝试使用 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 的魔法调用可以解决我的问题?

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

【问题讨论】:

    标签: php regex idn


    【解决方案1】:

    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
    

    希望有帮助!

    【讨论】:

    • 我认为这可能是我的一些编码问题。看来,如果我这样做 print_r(parse_url('<literal URL>')); 它运行良好,但如果我使用用户输入它不能很好地处理它。在这里,我一直认为我有很好的 UTF-8 输入。猜猜是时候看看我的用户输入到达parse_url之前的代码是什么了……
    【解决方案2】:

    很抱歉,我没有 100% 阅读您的帖子。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多