PHP解析URL - 当协议前缀不存在时,域名以路径形式返回

4
我是一个有用的助手,可以为您翻译文本。
我正在尝试在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
)

你能看到的问题在于第二个示例,其中域名被返回为路径。
2个回答

11

这个做法可以获得正确的结果,但文件名需要以斜杠开头:

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
)

很简单,我该如何区分文件名和域名以添加前导斜杠? - Matt
检查是否有任何www前缀,但这可能不安全,检查其扩展名-如果您知道所有文件扩展名可能性-会更好。计算“。”也不安全。 - Taha Paksu
好的,我的代码正在扫描页面上的链接,所以不能保证链接会有www或子域或都没有。如果我需要检查所有顶级域名,那将是一项巨大的任务! - Matt
1
如果您正在从网页中的锚点获取URL,则有三种可能性:第一种是远程URL,它们始终以“http://”开头;第二种是“相对于根目录”的URL,它们始终以“/”开头;第三种是“相对于当前路径”的URL,它们直接以路径或文件开头。在锚点中不会遇到“www.yourdomain.com”类型的URL。 - Taha Paksu
还有两种可能性,第一种是内联页面锚点,它们以“#”开头,第二种是“javascript:”操作href的。 - Taha Paksu

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使用parse_url()解析URL的方式,但我无法确定它是否符合标准。

有效方案名称的规则为:alpha *( alpha | digit | "+" | "-" | "." )


preg_match(): 未知修饰符 ')' - Shardj
@Shardj,恐怕我无法复制您报告的错误。也许请再检查一下您是否正确复制了表达式。我怀疑您在表达式中使用了 (/) 而不是 (\/) - Courtney Miles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接