Разделить URL-адрес на переменные страницы и папки с помощью php?

#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