Код для формирования абсолютного URL на PHP
« Решение проблемы с mysql_connect в PHP 7 | Собственный сервис оптимизации загрузки сайтов » |
Фев
11
Абсолютный URL на PHP
Web-программированиеК моему большому удивлению, в PHP нет готовой функции для построения абсолютного URL по относительному и базовому. Пришлось писать ее самому. И вот что получилось:
function abs_url($rel,$base) { $relp = parse_url($rel); // parts of relative url $basep = parse_url($base); // parts of base url $result = ''; $prev_changed = false; // indicator whether the preious part of url was changed, if true, no latter parts of base will be used if (empty($basep['scheme'])) $basep['scheme']='http'; $scheme = !empty($relp['scheme']) ? $relp['scheme'] : $basep['scheme']; if ($scheme) $result.=$scheme.':'; if (!empty($relp['host'])) { $host = $relp['host']; $prev_changed = true; } else $host=$basep['host']; if ($host) $result.='//'; if (!empty($relp['user']) || !empty($basep['user'])) { $user = !empty($relp['user']) ? $relp['user'] : $basep['user']; $password = !empty($relp['password']) ? $relp['password'] : $basep['password']; $result.=urlencode($user); if ($password) $result.=':'.urlencode($password); $result.='@'; } $result.=$host; if (!empty($relp['port']) || !empty($basep['port'])) { $port = !empty($relp['port']) ? $relp['port'] : $basep['port']; $result.=':'.$port; } if (!$prev_changed) { if (empty($basep['path'])) $basep['path']='/'; if (empty($relp['path'])) $path=$basep['path']; elseif ($relp['path'][0]==='/') { $path=$relp['path']; $prev_changed = true; } else { $path=dirname($basep['path'].'.'); if ($path!=='/' && $path!=='\\') $path.='/'; $path.=$relp['path']; $prev_changed = true; } $result.=$path; } elseif (!empty($relp['path'])) $result.=$relp['path']; if (!empty($relp['query'])) { $result.='?'.$relp['query']; $prev_changed = true; } elseif (!$prev_changed && !empty($basep['query'])) $result.='?'.$basep['query']; if (!empty($relp['fragment'])) $result.='#'.$relp['fragment']; elseif (!$prev_changed && !empty($basep['fragment'])) $result.='#'.$basep['fragment']; return $result; }
Использование: $url = absolute_url($relative_url,$base_url);
, где $relative_url - относительный URL, $base_url - базовый, относительно которого происходит дополнение.
Также этот код, но оформленный в виде класса, я выложил на GitHub.
Еще нет отзывов
Идет загрузка формы...
Последние комментарии