2012-04-28 68 views
3

我试图解析URL在PHP当输入可以是下列任何一种: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 
) 

你可以看到的问题是第二个例子,其中域是重变成一条路径。

回答

6

这给出正确的结果,但该文件需要开始以斜线:

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 
) 
+0

非常好!非常感谢你! – Matt 2012-04-28 00:42:35

+0

不客气。 – 2012-04-28 00:45:39

+0

只是一个快速的问题,我如何区分文件名和域名以追加前导斜杠? – Matt 2012-04-28 01:06:02

0

要在保存,这是一种方式处理网址是一个无模式的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 | "+" | "-" | ".")