php — получить имя текущей страницы из URL-адреса и переформатировать строку

У меня есть следующий код, который (1) получает имя страницы/раздела из URL-адреса (2) очищает строку, а затем присваивает ее переменной.

Мне было интересно, есть ли какие-либо предложения о том, как я могу улучшить этот код, чтобы он был более эффективным, возможно, с меньшим количеством операторов if/else.

Кроме того, любое предложение, как я могу закодировать это, чтобы оно учитывало x количество подкаталогов в структуре URL-адреса. Прямо сейчас я проверяю до 3 довольно ручным способом.

Я бы хотел, чтобы он обрабатывал любой URL-адрес, например: www.domain.com/level1/level2/level3/level4/levelx/...

Вот мой текущий код:

<?php

    $prefixName = 'www : ';
    $getPageName = explode("/", $_SERVER['PHP_SELF']);
    $cleanUpArray = array("-", ".php");

    for($i = 0; $i < sizeof($getPageName); $i++) {
        if ($getPageName[1] == 'index.php')
        {
            $pageName = $prefixName . 'homepage';
        }
        else
        {
            if ($getPageName[1] != 'index.php')
            {                   
                $pageName = $prefixName . trim(str_replace($cleanUpArray, ' ', $getPageName[1]));
            } 
            if (isset($getPageName[2]))
            {
                if ( $getPageName[2] == 'index.php' )
                {
                    $pageName = $prefixName . trim(str_replace($cleanUpArray, ' ', $getPageName[1]));
                }               
                else
                {
                    $pageName = $prefixName . trim(str_replace($cleanUpArray, ' ', $getPageName[2]));
                }
            }
            if (isset($getPageName[3]) )
            { 
                if ( $getPageName[3] == 'index.php' )
                {
                    $pageName = $prefixName . trim(str_replace($cleanUpArray, ' ', $getPageName[2]));
                }               
                else
                {
                    $pageName = $prefixName . trim(str_replace($cleanUpArray, ' ', $getPageName[3]));
                }
            }   
        }           
    }
?>

person IntricatePixels    schedule 13.09.2012    source источник
comment
используйте разделитель вместо ? в вашей схеме URL-адресов, и вы можете идти так глубоко, как хотите. example.com/some/deep/url/goes/ здесь/_/строка-запроса-здесь   -  person Tim G    schedule 13.09.2012
comment
Можете ли вы более четко объяснить, какой результат вы ищете?   -  person Touki    schedule 13.09.2012
comment
Этот вопрос также может относиться к теме Code Review.   -  person Herbert    schedule 13.09.2012
comment
Спасибо, Герберт, не знал, что существует новый сайт.   -  person IntricatePixels    schedule 14.09.2012


Ответы (2)


В настоящее время вы используете цикл for, но ни для чего не используете итератор $i, так что для меня вы можете полностью отказаться от цикла. Из того, что я вижу, вы просто хотите, чтобы имя каталога перед файлом было $pageName, и если нет предыдущего каталога, установите его как homepage.

Вы можете передать $_SERVER['PHP_SELF'] в basename(), чтобы получить точное имя файла вместо проверки индексов, а также разделить на / как вы сейчас делаете, чтобы получить «последний каталог». Чтобы получить последний каталог, вы можете пропустить индексы и напрямую использовать array_pop().

<?php

$prefixName = 'www : ';
$cleanUpArray = array("-", ".php");

$script = basename($_SERVER['PHP_SELF']);
$exploded = explode('/', substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/')));
$count = count($exploded);

if (($count == 1) && ($script == 'index.php')) {
    // the current page is "/index.php"
    $pageName = $prefixName . 'homepage';
} else if ($count > 1) {
    // we are in a sub-directory; use the last directory as the current page
    $pageName = $prefixName . trim(str_replace($cleanUpArray, ' ', array_pop($exploded)));
} else {
    // there is no sub-directory and the script is not index.php?
}

?>

Если вы хотите более хлебные крошки, вы можете сохранить каждый отдельный каталог. Если это так, вы можете обновить среднее условие if else следующим образом:

} else if ($count > 1) {
    // we are in a sub-directory; "breadcrumb" them all together
    $pageName = '';
    $separator = ' : ';
    foreach ($exploded as $page) {
        if ($page == '') continue;
        $pageName .= (($pageName != '') ? $separator : '') . trim(str_replace($cleanUpArray, ' ', $page));
    }
    $pageName = $prefixName . $pageName;
} else {
person newfurniturey    schedule 13.09.2012
comment
Мне очень нравится это решение, но оно игнорирует фактическое имя страницы, то есть www.domain.com/subdir/my-page.php, имя страницы будет подкаталогом, поэтому игнорируется my-page.php. Я хочу, чтобы это была www : subdir : моя страница - person IntricatePixels; 14.09.2012
comment
@taulant Имя файла находится в переменной $script, оно получается с помощью команды basename(). Вы можете использовать/форматировать его по своему усмотрению (например, с $pageName .= ' : ' . trim(str_replace($cleanUpArray, ' ', $page));). - person newfurniturey; 14.09.2012

Я нашел этот код очень полезным

$protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === 
FALSE ? 'http' : 'https';            // Get protocol HTTP/HTTPS

$host     = $_SERVER['HTTP_HOST'];   // Get  www.domain.com

$script   = $_SERVER['SCRIPT_NAME']; // Get folder/file.php

$params   = $_SERVER['QUERY_STRING'];// Get Parameters occupation=odesk&name=ashik

$currentUrl = $protocol . '://' . $host . $script . '?' . $params; // Adding all

echo $currentUrl;
person Muhammad Ashikuzzaman    schedule 20.05.2014