Разбейте / разберите URL на составные части в Stack Overflow

Каков наилучший способ разбить URL на соответствующие пути, чтобы

https://www.example.com/path/to/directory/file.jpeg?param1=foo&param2=bar

Результаты в массиве

Array(
["scheme"] => "https",
["host"] => www.example.com
["directory"] => "path/to/directory"["filename"] => "file"["extension] => "jpeg"["path"] => "path/to/directory/file.jpeg",
["file"] => "file.jpeg"["params"] => Array(
["param1"] => "foo",
["param2"] => "bar")
)

Замечания: Ключи не нужно называть так, они просто пример.

Я посмотрел на parse_url, но он не разделяет путь достаточно подробно, поэтому дальнейшая ручная обработка кажется неизбежной.

Примечание: Я смотрел в очень много множественный вопросы а также ответы, но я не могу найти какую-либо определенную ссылку, таким образом, мой вопрос.

0

Решение

Лучший способ — объединить усилия нескольких встроенных функций php, таких как parse_url (для основных частей URL), parse_str (для параметров запроса) и PathInfo (для части каталога, имени файла и расширения).

parse_url

parse_url проанализирует URL-адрес и разделит его на ассоциативный массив, содержащий следующие ключи (если они присутствуют в URL-адресе):

  • схема (http, https, ftp, …)
  • хост (www.example.com)
  • порт
  • пользователь
  • проходить
  • путь (это потребует дальнейшей обработки)
  • запрос (это потребует дальнейшей обработки)
  • фрагмент (часть якоря / hashbang, все что угодно после хеш-метки)

parse_str

parse_str может использоваться для разбора query часть из parse_url в многомерный (при необходимости) ассоциативный массив.

PathInfo

pathinfo может использоваться для разбора path часть из parse_url в ассоциативный массив, который может содержать следующие ключи:

[dirname] => /path/to/directory
[basename] => file.jpeg
[extension] => jpeg
[filename] => file

Собираем все вместе

function decompose_url($url) {
$parts = parse_url($url);
if (!$parts) {
# For seriously malformed urls
return false;
}
# Just for good measure, throw in the top level domain, if there is a host with a top level domain
if (array_key_exists('host', $parts) && strrpos($parts['host'], '.') !== false) {
$domain_parts = explode('.', $parts['host']);
$parts['tld'] = end($domain_parts);
}
if (array_key_exists('path', $parts)) {
$pathinfo = pathinfo($parts['path']);
if (empty($pathinfo['basename'])) {
# With an empty basename, extension and filename will also be empty
unset($pathinfo['basename']);
unset($pathinfo['extension']);
unset($pathinfo['filename']);

}
$parts = array_merge($parts, $pathinfo);
}
if (array_key_exists('query', $parts)) {
parse_str($parts['query'], $query_parts);
$parts['query_parts'] = $query_parts;
}
return $parts;
}

Дать ему тест

$urls = [
'http://www.example.com/',
'http://www.example.com',
'http://www.example.com/test/.jpg',
'http://www.example.com/test/.'
'https://anonymous:[email protected]:8080/path/to/directory/file.jpeg?param1=foo&param2=bar&param3[1]=abc&param3[2]=def#anchor',
'ftp://[email protected]/pub/test.jpg',
'file:///home/user/.config/test.config',
'chrome://settings/passwords',
];

foreach ($urls as $url) {
echo $url, PHP_EOL;
var_export(decompose_url($url));
echo PHP_EOL, PHP_EOL;
}

даст эти соответствующие результаты:

http://www.example.com/
array (
'scheme' => 'http',
'host' => 'www.example.com',
'path' => '/',
'tld' => 'com',
'dirname' => '/',
)

http://www.example.com
array (
'scheme' => 'http',
'host' => 'www.example.com',
'tld' => 'com',
)

http://www.example.com/test/.jpg
array (
'scheme' => 'http',
'host' => 'www.example.com',
'path' => '/test/.jpg',
'tld' => 'com',
'dirname' => '/test',
'basename' => '.jpg',
'extension' => 'jpg',
'filename' => '',
)

http://www.example.com/test/.
array (
'scheme' => 'http',
'host' => 'www.example.com',
'path' => '/test/.',
'tld' => 'com',
'dirname' => '/test',
'basename' => '.',
'extension' => '',
'filename' => '',
)

https://anonymous:[email protected]:8080/path/to/directory/file.jpeg?param1=foo¶m2=bar¶m3[1]=abc¶m3[2]=def#anchor
array (
'scheme' => 'https',
'host' => 'www.example.com',
'port' => 8080,
'user' => 'anonymous',
'pass' => 'dCU7egW1A1L0a6pxU3qu9',
'path' => '/path/to/directory/file.jpeg',
'query' => 'param1=foo&param2=bar&param3[1]=abc&param3[2]=def',
'fragment' => 'anchor',
'tld' => 'com',
'dirname' => '/path/to/directory',
'basename' => 'file.jpeg',
'extension' => 'jpeg',
'filename' => 'file',
'query_parts' =>
array (
'param1' => 'foo',
'param2' => 'bar',
'param3' =>
array (
1 => 'abc',
2 => 'def',
),
),
)

ftp://[email protected]/pub/test.jpg
array (
'scheme' => 'ftp',
'host' => 'ftp.example.com',
'user' => 'anonymous',
'path' => '/pub/test.jpg',
'tld' => 'com',
'dirname' => '/pub',
'basename' => 'test.jpg',
'extension' => 'jpg',
'filename' => 'test',
)

file:///home/user/.config/test.config
array (
'scheme' => 'file',
'path' => '/home/user/.config/test.config',
'dirname' => '/home/user/.config',
'basename' => 'test.config',
'extension' => 'config',
'filename' => 'test',
)

chrome://settings/passwords
array (
'scheme' => 'chrome',
'host' => 'settings',
'path' => '/passwords',
'dirname' => '/',
'basename' => 'passwords',
'filename' => 'passwords',
)
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]