#php #url #variables #split #directory
#php #url #переменные #разделить #каталог
Вопрос:
В настоящее время я использую следующий код для получения переменной страницы, раздела и класса из URL.
$domain = 'http://' . $_SERVER['HTTP_HOST'];
$path = $_SERVER['REQUEST_URI'];
$url = $domain . $path;
// page section class
$page = basename($url);
$page = $class = str_replace('.php','',$page);
$page = str_replace('-',' ',$page);
if ($path == "/") {
$section = $class = "home";
} else if (basename(dirname($url),"/") == $_SERVER['HTTP_HOST']) {
$section = $page;
} else {
$section = basename(dirname($url),"/");
$section = str_replace('-',' ',$section);
$class = basename(dirname($url),"/") . " " . $class;
}
Например, если URL-адрес http://www.mydomain.co.uk/about/
, код вернет следующие переменные:
$page = "about"
$section = "about"
$class = "about"
Для http://www.mydomain.co.uk/about/general-info/
$page = "general info"
$section = "about"
$class = "about general-info"
Но когда я добавляю больше глубины, например для http://www.mydomain.co.uk/about/general-info/history/
кода to, получается:
$page = "history"
$section = "general info"
$class = "general-info history"
где в идеале мне нужно, чтобы он выводил следующее:
$page = "history"
$section = "about general info"
$class = "about general-info history"
или разбить разделы на столько, сколько необходимо, например:
$section1 = "about"
$section2 = "general-info"
Надеюсь, кто-нибудь сможет помочь. Если что-то неясно, пожалуйста, спрашивайте.
Комментарии:
1. не могли бы вы, пожалуйста, сказать мне, до скольких уровней будет идти URL-адрес? как здесь, вы предоставили до 3-го уровня.
2. В большинстве случаев это будет только до 3-го. Возможно, он мог бы перейти на 4-й, но в настоящее время 3-й
3. Проверьте первый ответ фердинанда. Я предпочитаю то же самое.
Ответ №1:
Как насчет использования более общего разделения?
// Url: http://www.mydomain.co.uk/about/general-info/history/
$slices = explode('/', $_SERVER['REQUEST_URI']);
// $slices == ['about', 'general-info', 'history']
Затем выполните свою маршрутизацию так, как вы хотите:
$class = implode(' ', $slices);
$section = $slices[1];
// etc.
Комментарии:
1. Простой — это лучше, имо.
Ответ №2:
Итак, вам нужна URI-схема следующим образом?
http://<domain>/<section-1>/<section-2>/.../<page>/
Особые случаи:
(1) http://<domain>/ -- page is empty, section is "home"
(2) http://<domain>/<section>/ -- page and section are '<section>'
Вместо того чтобы полагаться на basename()
, вам следует разбить свою строку на массив, используя explode()
или preg_split()
. Вы можете использовать REQUEST_URI
напрямую, поскольку доменное имя не предоставляет никакой дополнительной информации для ваших разделов и страницы.
Получив массив, вы можете легко count()
изменять количество компонентов пути, обрабатывать особые случаи для пустых путей и путей с одним размером и так далее. В следующем примере я использую array_pop()
для извлечения последней части пути, чтобы отделить страницу от разделов. Поскольку вам, похоже, нужны строки, разделенные пробелами, для разделов и страницы, я использую implode()
для объединения массивов обратно в строку.
// No need for the domain stuff!
$path = $_SERVER['REQUEST_URI'];
// Split at '/', could use explode() but the PREG_SPLIT_NO_EMPTY flag is
// very handy since it handles "//" and "/" at start/end.
$tokens = preg_split('#/#', $path, -1, PREG_SPLIT_NO_EMPTY);
if (count($tokens) == 0) {
// Special case 1
$page = "";
$section = $class = 'home';
} elseif (count($tokens) == 1) {
// Specical case 2
$page = $section = $class = $tokens[0];
} else {
// Class contains all tokens.
$class = implode(' ', $tokens);
// The last part is the page.
$page = array_pop($tokens);
// Everything else are sections.
$sections = implode(' ', $tokens);
}
// You seem to want spaces for dashes in the section:
$section = str_replace('-', ' ', $section);
Комментарии:
1. Работает хорошо, большое вам спасибо. Дает мне гибкость для отображения, скрытия и выбора определенных элементов по всему сайту путем тестирования на $ page и $ section. Это сайт на базе php, использующий perch в качестве cms и поэтому не управляет страницами. $ class просто добавляет простой класс к тегу body, просто в том случае, если страница нуждается в немного ином оформлении. Для тестирования страницы или раздела я использовал следующее:
<?php if ($section == strstr($section, 'general information')) { ?>
Это работает, но правильно ли это или лучший способ действовать?2. Чтобы протестировать раздел, вам, вероятно, следует пропустить
implode()
часть, сохранив список разделов в виде массива, и использоватьin_array("general-information", $sections)
вместо этого. Смотрите: php.net/in_array