解析没有路径但在查询中使用斜杠的URL

RoT*_*oRa 5 php url

我解析URL的问题比没有路径但查询中有斜杠有问题.例如:http://example.com?q=a/b

我知道这样的URL很可能是无效的(*) - 它至少需要一个斜杠作为这样的路径:http://example.com/?q=a/b.

我尝试过这种URL的所有浏览器都会自动更正URL.这基本上就是我想要重现的:识别并纠正这样的URL.

parse_url然而使用产生:

var_dump( parse_url('http://example.com?q=a/b') );

array(3) {
  ["scheme"]=>
  string(4) "http"
  ["host"]=>
  string(15) "example.com?q=a"
  ["path"]=>
  string(2) "/b"
}
Run Code Online (Sandbox Code Playgroud)

虽然在查询中没有斜杠的URL可以正常工作:

var_dump( parse_url('http://example.com?q=ab') );

array(3) {
  ["scheme"]=>
  string(4) "http"
  ["host"]=>
  string(11) "example.com"
  ["query"]=>
  string(4) "q=ab"
}
Run Code Online (Sandbox Code Playgroud)

我尝试过的所有外部库(Jwage\Purl,League\Url,Saber\Uri)基本上都做同样的事情,这让我感到惊讶.

为什么(所有?)浏览器"正确",而(所有?)PHP库让它"错误"?

除了在解析URL之前尝试使用正则表达式捕获这些情况(这可能是不可靠的 - 这就是我想首先使用库的原因),我还有哪些替代方案?

(*)我咨询了三个来源:RFC 1738,RFC 3986,WHATWG URL Standard,他们三人都不同意什么是有效的.

car*_*10m 1

如果您仍想应用正则表达式,则以下内容应生成您要查找的 URL:

$url=pcre_replace('/([^/]+:\/\/[^/]+)\?/', '$1/?',$url);
Run Code Online (Sandbox Code Playgroud)

它要求 URL 以至少一个字符的协议名称开头,后跟“://”、至少一个字符的域名(“localhost”也可以接受)。之后,它会在“?”之前插入“/”,但前提是“?”之前不再有“/”。