3

我正在尝试在 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
)

您可以看到的问题是域作为路径返回的第二个示例。

4

2 回答 2

9

这给出了正确的结果,但文件需要以斜杠开头:

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
)
于 2012-04-28T00:18:48.320 回答
0

要以保留它是无模式 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 | "+" | "-" | "." )

于 2017-11-13T06:15:54.857 回答