我正在尝试解析PHP中的URL,其中输入可能是以下任何一项:
法典:
$info = parse_url('http://www.domainname.com/');
print_r($info);
$info = parse_url('www.domain.com');
print_r($info);
$info = parse_url('/test/');
print_r($info);
$info = parse_url('test.php');
print_r($info);
返回:
Array
(
[scheme] => http
[host] => www.domainname.com
[path] => /
)
Array
(
[path] => www.domain.com
)
Array
(
[path] => /test/
)
Array
(
[path] => test.php
)
您可以看到的问题是第二个示例,其中域作为路径返回。
这给出了正确的结果,但文件需要以斜杠开头:
parse('http://www.domainname.com/');
parse('www.domain.com');
parse('/test/');
parse("/file.php");
function parse($url){
if(strpos($url,"://")===false && substr($url,0,1)!="/") $url = "http://".$url;
$info = parse_url($url);
if($info)
print_r($info);
}
结果是:
Array
(
[scheme] => http
[host] => www.domainname.com
[path] => /
)
Array
(
[scheme] => http
[host] => www.domain.com
)
Array
(
[path] => /test/
)
Array
(
[path] => /file.php
)
若要以保留它是无架构 URL 的方式处理 URL,同时还允许标识域,请使用以下代码。
if (!preg_match('/^([a-z][a-z0-9'-'.'+]*:)|('/)/', $url)) {
$url = '//' . $url;
}
因此,仅当 URL 没有有效的方案且不以"/"开头时,才会将"//"应用于 URL 的开头。
关于这方面的一些快速背景:
解析器假定 ":" 之前的(有效)字符是架构,而 "//" 后面的字符是域。 要指示 URL 同时具有方案和域,必须连续使用这两个标记"://"。例如
-
[scheme]:[path//path]
-
//[domain][/path]
-
[scheme]://[domain][/path]
-
[/path]
-
[path]
这就是 PHP 解析 URL 的方式,parse_url()
但我不能说它是否符合标准。
有效方案名称的规则为:alpha *( alpha | digit | "+" | "-" | "." )