Вы находитесь на странице: 1из 4

Лекции курса PHP7 + MySQL с нуля

(краткое содержание)

ЛЕКЦИЯ 42. РАБОТА С СЕТЬЮ. ПАРСИНГ URL

При разработке веб-приложений одной из задач является возможность


разбора и анализа URL-адреса для дальнейшей его обработки и использования.
Так как по своей сути URL является строкой, то и работать с его элементами
можно как со строковыми элементами. Но перед тем, как работать с элементами,
необходимо их получить. Для этой цели служит функция parse_url():

Разбор URL
mixed parse_url(string $url [, int $component = -1 ])
Функция принимает на входе URL, разбивает его на элементы и возвращает
их в виде ассоциативного массива.
Рассмотрим пример работы функции со следующим URL:
http://login:pass@www.example.com:80/path/to/page.php?param=value#anchors
Листинг 42.1. Работа функции parse_url()

//Задаем url-адрес
$url =
"http://login:pass@www.example.com:80/path/to/page.php?param=value#anchors";

$url_arr = parse_url($url);

//Выводим разобранный на элементы URL


foreach($url_arr as $k => $v)
echo "<p>[{$k}] => <i>{$v}</i></p>";

В результате Вы получите массив из 7 элементов:


[scheme] => http
[host] => www.example.com
[port] => 80
[user] => login
[pass] => pass
[path] => /path/to/page.php
[query] => param=value
[fragment] => anchors
В этом массиве каждый элемент несет свою роль в структуре URL:
- scheme указывает на имя используемого протокола;
- host – полное имя хоста;
- port – номер порта;
- user – имя пользователя;
- pass – пароль пользователя;
- path – URI запроса;
- query – параметры строки запроса;
- fragment – имена HTML-якорей.
При этом стоит учитывать, что во многих случаях часть этих элементов может
отсутствовать и тогда функция создаст массив только из тех элементов, которые
имеются с привязкой к нужному ключу.

1
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

Отдельно стоит сказать о параметре $component, по умолчанию принимающем


значение -1. Это параметр может принимать значение любого из элементов
массива: PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_USER,
PHP_URL_PASS, PHP_URL_PATH, PHP_URL_QUERY или PHP_URL_FRAGMENT. Если
параметр задан явно, то функция вернет не массив, а заданный элемент в
строковом формате.

Сборка URL
Для сборки URL не предусмотрено стандартной функции. Существуют
дополнительные библиотеки, такие как PECL, которые имеют в наличии функции
http_build_str() и http_build_url(). В этом уроке Вы построите функции сборки URL
самостоятельно, но какой выбор делать в будущем, использовать функцию
собственной сборки или же готовые пакеты – решать Вам. Чаще всего в подобных,
расширяющих возможности PHP, пакетах присутствует большое количество
полезных инструментов, которые были неоднократно протестированы и их
использование будет оптимальным решением. Главное – не использовать те
расширения, которые не требуются в работе над проектом и не перегружать его.
Теперь перейдем к функции сборки URL:
Листинг 42.2. Функция сборки URL

function build_url($arr) {
//Проверяем, является входящая функция массивом или строкой
$url = "";
if(is_array($arr)){
//Проверяем, задан ли протокол
if(isset($arr['scheme']))
$url .= $arr['scheme']."://";

//Проверяем наличие логина и пароля


if(isset($arr['user']) && isset($arr['pass']))
$url .= $arr['user'].":".$arr['pass']."@";
elseif(isset($arr['user']) && !isset($arr['pass']))
$url .= $arr['user']."@";

//Добавляем имя хоста и номер порта


if(isset($arr['host']) && !isset($arr['port']))
$url .= $arr['host'];
elseif(isset($arr['host']) && isset($arr['port']))
$url .= $arr['host'].":".$arr['port'];

//Проверяем наличие URI


if(isset($arr['path']))
$url .= $arr['path'];

//Проверяем наличие параметров запроса и его вид (если массив - его


необходимо преобразовать в строку, если строка - просто добавить в URL)
if(isset($arr['query']) && is_array($arr['query'])) {
$query = "";

2
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

foreach($arr['query'] as $v) {
if($arr[1])
$query .= $v;
else
$query .= "&".$v;
}
} elseif(isset($arr['query']) && is_string($arr['query'])) {
$query = $arr['query'];
}
$url .= "?".$query;

//Аналогично проверке параметров запроса проверяем HTTP-якоря


if(isset($arr['fragment']))
$url .= "#".$arr['fragment'];

return $url;
} else return false;
}

//Задаем url-адреса для проверки функции build_url()


$url1 =
"http://login:pass@www.example.com:80/path/to/page.php?key=value&key1=value1&key2=v
alue2#anchors";
$url2 = "example.com?Key1=Value1";
$url3 = "http://website.ru.com/path/to/sub/page.html#anchor";

echo "<p><b>Первоначальный URL_1:</b> {$url1}</p>";


echo "<p><b>Первоначальный URL_2:</b> {$url2}</p>";
echo "<p><b>Первоначальный URL_3:</b> {$url3}</p>";

//Разбираем URL на массивы


$url_arr1 = parse_url($url1);
$url_arr2 = parse_url($url2);
$url_arr3 = parse_url($url3);

//Выводим разобранные на элементы URL


echo "<b>Массив из первого URL:</b>";
foreach($url_arr1 as $k => $v)
echo "<p>[{$k}] : <i>{$v}</i>";
echo "<hr>";

echo "<b>Массив из второго URL:</b>";


foreach($url_arr2 as $k => $v)
echo "<p>[{$k}] : <i>{$v}</i>";
echo "<hr>";

echo "<b>Массив из третьего URL:</b>";

3
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

foreach($url_arr3 as $k => $v)


echo "<p>[{$k}] : <i>{$v}</i>";
echo "<hr>";

//Собираем URL из массивов


$build_url1 = build_url($url_arr1);
$build_url2 = build_url($url_arr2);
$build_url3 = build_url($url_arr3);

//Выводим полученные url


echo "<p><b>Первый URL:</b> {$build_url1}</p>";
echo "<p><b>Второй URL:</b> {$build_url2}</p>";
echo "<p><b>Третий URL:</b> {$build_url3}</p>";

Запустив листинг 42.2 Вы увидите как несколько вариантов изначально


заданных url были разобраны стандартной функцией parse_url() на ассоциативный
массив и затем были собраны самостоятельно собранно функцией build_url() в
первоначальные их состояния.
И все же, при работе с самодельными функциями стоит помнить о том, что
учесть всевозможные варианты очень проблематично и порой, если Вы работаете
над большим проектом, проще подключать готовые сторонние библиотеки,
проверенные тысячами разработчиков и учитывающие максимально возможное
количество непредвиденных обстоятельств.