最终的PHP url解析器

时间:2012-10-02 09:29:43

标签: php validation url

在你告诉我使用parse_url之前,它不够好并且有太多错误。关于解析URL的主题有很多问题可以在这里找到,但几乎所有问题都只解析某些特定类别的URL或者不完整。

我正在寻找一个符合RFC标准的最终URL解析器,它可以可靠地处理浏览器可能遇到的任何URL。在此我包括:

  • 网页内部链接##title
  • 网页相对网址blah/thing.php
  • 网站相对网址/blah/thing.php
  • 匿名协议网址//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js
  • Callto URL callto:+442079460123
  • 文件网址file:///Users/me/thisfile.txt
  • Mailto网址mailto:user@example.com?subject=hellomailto:?subject=hello

并支持所有常用的scheme / authentication / domain / path / query / fragment等,并将所有这些元素分解为一个数组,并为相对/无模式URL提供额外的标志。理想情况下,它会带有一个支持相同元素的URL重构器(如http_build_url),我也想要应用验证(即如果它无效,它应该能够对URL进行最佳猜测,但标记它就像这样,就像浏览器一样。)

This answer包含了对这种野兽的诱人的费马风格参考,但它实际上并没有去任何地方。

我查看了所有主要框架,但它们似乎只提供了围绕parse_url的瘦包装器,这通常是一个不好的起点,因为它会犯很多错误。

那么,这样的事情是否存在?

1 个答案:

答案 0 :(得分:3)

不确定parse_url()有多少错误,但这可能会有所帮助:

  

由于“第一场比赛胜利”算法与“贪婪”相同      POSIX正则表达式使用的消歧方法,它是      自然而普通的使用正则表达式来解析      URI引用的潜在五个组件。

     

以下行是用于分解a的正则表达式      格式良好的URI引用到其组件中。

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
 12            3  4          5       6  7        8 9

来源:http://tools.ietf.org/html/rfc3986#page-51

它将位置分解为:

$2 - scheme
$4 - host
$5 - path
$6 - query string
$8 - fragment

要重建,您可以使用:

$1 . $3 . $5 . $6 . $8