Разделить URL на переменные страницы и папки с помощью php? - PullRequest
1 голос
/ 26 мая 2011

В настоящее время я использую следующий код для получения переменной страницы, раздела и класса из 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/ к коду выдается:

$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"

Надеюсь, кто-то может помочь.Если что-то неясно, пожалуйста, спросите.

Ответы [ 2 ]

5 голосов
/ 26 мая 2011

Как насчет использования более общего разбиения?

// 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.
2 голосов
/ 26 мая 2011

Итак, вам нужна 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);
...