Forum Webscript.Ru
Программирование => PHP => Тема начата: kosm от 28 Мая 2003, 18:06:17
-
Никак не могу получить путь без имени файла. Пробовал использовать dirname(), но работает она не совсе так, как надо (в некоторых случаях). К примеру:
Есть путь: http://www.host.ru/test/index.php
В этом случае ф-ция сработает правильно, т.е. вернет "http://www.host.ru/test/".
Теперь такой: http://www.host.ru/test/
И опять ф-ция сработает правильно.
А вот если путь будет такой: http://www.host.ru/test
т.е. без завершающего слэша, то ф-ция вернет "http://www.host.ru/"
Как мне сделать так, чтобы я смог во всех этих трех случаях получить путь "http://www.host.ru/test"?
СПАСИБО!
-
kosm
а исходя из каких суждений скрипт должен думать что в http://www.host.ru/test test является папкой а не файлом ?
Вручную наверное нужно что-то писать (или слеш добавлять чтобы правильно dirname() работал)
-
$path = str_replace(basename($path), \'\', $path);
-
Макс
Я думаю - наличием расширения. Хотя файл без расширения тоже может быть, но тогда это точно никак не узнать...
Поэтому я состряпал ф-цию:
function GetPath($url)
{
$tmp = pathinfo($url);
$ext = $tmp["extension"];
if (strpos($ext, "/") > 0) {
Return $tmp["dirname"]."/".$tmp["basename"]."/";
}
else {
Return $tmp["dirname"]."/";
}
}
Вроде работает. Можно было бы наверно и по-красивше...
D1g174LM4n14c
Не совсем понял как все это работает, и работает ли вообще... У меня во всяком случае не прокатило :(
-
kosm
У меня просто имя файла удаляеться из строки тем самым оставляя только путь без имени файла...
function GetPath($url)
{
return str_replace(basename($url), \'\', $url);
}
-
Вообщето для тех кто не вкурсе - если нету завершающего слеша то это __всегда__ имя файла. Для примера введите
http://www.deep.kiev.ua/icons
и
http://www.deep.kiev.ua/icons/
почуствуйте разницу.
Только добрые люди, делающие веб сервера устали это всем рассказывать. И исправили свои сервера. Теперь это работает так
1. присылается УРЛ неправильный
2. сервер смотрит что такого файла нету, зато есть такой каталог
3. он отвечает "302 , ресурс был перемещен на УРЛ/"
4. Броузер делает второй запрос - уже правильный.
А мой пример - дело в том, что для виртуальных каталогов это исправление не работает ;)
Можете проверить на любом сервере Apache.
-
Oak
Все верно. Вот только если бы это поняли все... :(
-
А так не проще?
echo $_SERVER["HTTP_HOST"];
echo dirname($_SERVER["REDIRECT_URL"]);
?>
-
Mаster
Да, интересный выход, но опять же мне не подойдет, т.к. я еще не на той странице, а только собираюсь туда пойти. УРЛ берется у меня из href...
Oak
Эт понятно. Но в моем случае нужно считать, что если нет расширения в конце урла, то это просто каталог, а если есть, то надо имя с расширением отсечь.
D1g174LM4n14c
Понятно. Но basename() не работает по класической схеме, т.е. смотрит на наличие слэша в конце урла, и опять же он решит, что "test" (из моего примера выше) - это файл, и выкусит его. :(
Кстати, интересно, вчера ф-ция, которую я выше описал - работала. А сегодня уже нет :) Странно как-то :)
Почему-то урл: http://www.host.ru/test
превращает в: http:/www.host.ru/test/ (двойной слэш портит).
Странно все это...
-
И что. Вот так незя сделать?
$url = "http://abracodabra.ru/path/to/page/index.php";
echo dirname($url);
?>
-
Можно ещё сделать так:
$url = "http://abracodabra.ru";
$path = "/path/to/page/index";
if (preg_match("/(\\.)\\w+/",$path)) {
echo dirname($url.$path)."
";
} else {
echo preg_replace("/(.*)^\\//","\\\\1",$url.$path)."
";
}
?>
-
Mаster
И что. Вот так незя сделать?
$url = "http://abracodabra.ru/path/to/page/index.php";
echo dirname($url);
?>
В этом случае прокатит. А вот если
$url = "http://abracodabra.ru/path/to/page";
то не прокатит - получим: "http://abracodabra.ru/path/to", что для моего случая не приемлемо :(
Со вторым примером не совсем понял, но у меня в любом случае имеется только полный урл (без разделения на url и path)...
Кстати, нашел почему у меня ломался двойной слэш в моей ф-ции.
Оказывается так работает ф-ция pathinfo(), если ей передать короткий урл (без вложений папок и имен файлов).
К примеру так:
$url = "http://test.ru/"; // вроде нормальный урл
$tmp = pathinfo($url);
print_r($tmp);
Получаем:
Array ( [dirname] => http: [basename] => test.ru [extension] => ru/ )
Не плохо он урл разложил, да? :) Чем он ему не понравился... ?
-
pathinfo() returns an associative array containing information about path(а не урл). The following array elements are returned: dirname, basename and extension.
Для решения проблемы юзай parse_url + pathinfo
-
С pathinfo понял - спасибо. Не обратил внимания что именно путь. Сорри.
Alexandr:
Для решения проблемы юзай parse_url + pathinfo
Во, это действительно спасло. Теперь все работает.
function GetPath($url)
{
$tmp = parse_url($url);
$host = $tmp["scheme"] ."://". $tmp["host"];
$path = $tmp["path"];
if (substr($path,strlen($path)-1,1) != \'/\') {
$path = $path."/";
}
Return $host.$path;
}
-
kosm:
Понятно. Но basename() не работает по класической схеме, т.е. смотрит на наличие слэша в конце урла, и опять же он решит, что "test" (из моего примера выше) - это файл, и выкусит его.
слеш \'/\' в конце игнорируетсяа dirname() и basename() ...
-
Лучше так:
$path=rtrim($path, "/")."/";
вместо
if (substr($path,strlen($path)-1,1) != \'/\') {
$path = $path."/";
}
-
Alexandr
Логично :) Спасибо! Эт я по старинке... ;)