PHP dirname() теряет последнюю папку

Эта проблема

Это очень простой для понимания вопрос.

У меня есть пользователь, отправляющий URL-адрес, например "http://example.com/path/filename.html".

Я использую PHP dirname() функция, чтобы получить так называемую "базу" этого URL. Для приведенного выше примера это будет "http://example.com/path".

Моя проблема возникает, когда пользователь вводит это:

http://example.com/blog

Если вы наберете вышеупомянутое в своем браузере, вы увидите страницу index.php или.html в папке "blog". Тем не менее, PHP dirname() вернет только "http://example.com".

Я не уверен, считает ли он, что "блог" - это файл без расширения, если таковой существует, но я не могу действительно найти решение.

Вещи, которые я пробовал

Сначала я попытался получить расширение URL с помощью этого быстрого метода:

$url = 'http://example.com/index.php';
$file_extension = end(explode('.', $filename));

Затем я бы проверил, существует ли расширение с использованием PHP empty(), Если расширение существует, это означает, что имя файла было введено после папки, например "http://example.com/path/file.html", и dirname() идеально. Если расширение не существует, файл не был введен, и последний элемент в пути является папкой, поэтому он уже является "базовым".

Тем не менее, в случае просто "http://example.com/path/", приведенное выше вернет ".com / path /" в качестве расширения файла, которое, как мы все знаем, не существует. В этом случае я бы использовал dirname() Функция и отрезать "/ путь /".

РЕДАКТИРОВАТЬ:

Принимая продление basename($url) не будет работать, потому что если пользователь вводит "http://example.com" basename() возвращает "example.com", расширение для которого предположительно ".com"

Надеюсь, у кого-то была такая же проблема, и она знает решение. Я все еще ищу, но любые ответы приветствуются!!

1 ответ

Решение

РЕДАКТИРОВАТЬ Хорошо, в прошлый раз, прежде чем я сдаюсь:

function getPath($url){
    $parts=explode("/",$url);
    $patharray=array(".","http:","https:");
    if(!in_array(pathinfo($url,PATHINFO_DIRNAME),$patharray) && strpos($parts[count($parts)-1], ".")!==false)
        unset($parts[count($parts)-1]);
    $url=implode("/",$parts);
    if(substr($url,-1)!='/')
        $url.="/";
    return $url;
}
echo getPath("http://www.google.com/blog/testing.php")."\n";
echo getPath("www.google.com/blog/testing.php")."\n";
echo getPath("http://www.google.com/blog/")."\n";
echo getPath("http://www.google.com/blog")."\n";
echo getPath("http://www.google.com")."\n";
echo getPath("http://www.google.com/")."\n";
echo getPath("www.google.com/")."\n";
echo getPath("www.google.com")."\n";

Любой URL с последней частью, имеющей "." в нем разбирается, иначе остается один. Оно использует pathinfo() проверить, является ли это просто доменом ("google.com" или "http://www.google.com"), а затем оставить последнюю часть в покое, так как будет "." в этом. Вот вывод скрипта:

http://www.google.com/blog/
www.google.com/blog/
http://www.google.com/blog/
http://www.google.com/blog/
http://www.google.com/
http://www.google.com/
www.google.com/
www.google.com/
Другие вопросы по тегам