PHP Parse URL - домен возвращается как путь, когда префикс протокола отсутствует

Я пытаюсь проанализировать URL-адреса в PHP, где входные данные могут быть следующими:

Код:

$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 ответа

Решение

Это дает правильные результаты, но файл должен начинаться с косой черты:

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 | "+" | "-" | "." )

Другие вопросы по тегам