最终的PHP url解析器

Syn*_*hro 9 php validation url

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

我正在寻找一个在PHP中符合RFC的最终URL解析器,它可以可靠地处理浏览器可能遇到的任何URL.在这里我包括:

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

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

这个答案包含一个诱人的费马风格的参考这样的野兽,但它实际上并没有去任何地方.

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

那么,这样的事情存在吗?

Ja͢*_*͢ck 3

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

由于“first-match-wins”算法与 POSIX 正则表达式使用的“贪婪”消歧方法相同,因此使用正则表达式来解析 URI 引用的潜在五个组成部分是很自然且常见的。

以下行是将格式正确的 URI 引用分解为其组件的正则表达式。

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

资料来源:https ://www.rfc-editor.org/rfc/rfc3986#page-51

它将位置分解为:

$2 - scheme
$4 - host
$5 - path
$6 - query string
$8 - fragment
Run Code Online (Sandbox Code Playgroud)

要重建,您可以使用:

$1 . $3 . $5 . $6 . $8
Run Code Online (Sandbox Code Playgroud)