Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 解析没有路径但查询中有斜杠的URL_Php_Url - Fatal编程技术网

Php 解析没有路径但查询中有斜杠的URL

Php 解析没有路径但查询中有斜杠的URL,php,url,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') ); ar

我在解析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"
}
在查询中使用不带斜杠的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"
}
我尝试的所有外部库(,)基本上都做相同的事情,这让我有点吃惊

为什么(所有?)浏览器都“正确”,而(所有?)PHP库却“错误”

除了在解析URL之前尝试用正则表达式捕捉这些情况(这可能不可靠——这就是为什么我首先要使用库),我还有什么选择


(*)我咨询了三个来源:,他们三个都不同意什么是有效的。

如果您仍然想应用正则表达式,下面应该生成您要查找的URL:

$url=pcre_replace('/([^/]+:\/\/[^/]+)\?/', '$1/?',$url);

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

WHATWG URL标准最接近浏览器实现的内容。其他软件还没有完全一致,不过PHP可能可以工作。(未尝试过。)

正则表达式不是真正的问题(除非我不希望出现误报)。我将使用:
preg\u match(~ ^(https?:/(?:[a-z0-9-]+\)*[a-z0-9-]+(?:\d+)(\?*),…)
OK,这可能会成功!我的解决方案是在使用
parse_url()
解析字符串之前对字符串进行预处理。有一个报告的错误正在讨论此问题: