Forum Webscript.Ru

Программирование => PHP => Тема начата: kosm от 28 Мая 2003, 18:06:17

Название: Как получить путь без иени файла?
Отправлено: 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"?

СПАСИБО!
Название: Как получить путь без иени файла?
Отправлено: Макс от 28 Мая 2003, 18:27:12
kosm
а исходя из каких суждений скрипт должен думать что в  http://www.host.ru/test  test является папкой а не файлом ?
 
Вручную наверное нужно что-то писать (или слеш добавлять чтобы правильно dirname() работал)
Название: Как получить путь без иени файла?
Отправлено: D1g174LM4n14c от 28 Мая 2003, 18:34:50
$path = str_replace(basename($path), \'\', $path);
Название: Как получить путь без иени файла?
Отправлено: kosm от 28 Мая 2003, 19:03:07
Макс
Я думаю - наличием расширения. Хотя файл без расширения тоже может быть, но тогда это точно никак не узнать...
Поэтому я состряпал ф-цию:

function GetPath($url)
{
$tmp = pathinfo($url);
$ext = $tmp["extension"];

if (strpos($ext, "/") > 0) {
Return $tmp["dirname"]."/".$tmp["basename"]."/";
}
else {
Return $tmp["dirname"]."/";
}
}


Вроде работает. Можно было бы наверно и по-красивше...

D1g174LM4n14c
Не совсем понял как все это работает, и работает ли вообще... У меня во всяком случае не прокатило :(
Название: Как получить путь без иени файла?
Отправлено: D1g174LM4n14c от 28 Мая 2003, 20:07:05
kosm
У меня просто имя файла удаляеться из строки тем самым оставляя только путь без имени файла...

function GetPath($url)
{
   return str_replace(basename($url), \'\', $url);
}
Название: Как получить путь без иени файла?
Отправлено: Oak от 29 Мая 2003, 02:22:38
Вообщето для тех кто не вкурсе - если нету завершающего слеша то это __всегда__ имя файла. Для примера введите

http://www.deep.kiev.ua/icons
и
http://www.deep.kiev.ua/icons/

почуствуйте разницу.

Только добрые люди, делающие веб сервера устали это всем рассказывать. И исправили свои сервера. Теперь это работает так
1. присылается УРЛ неправильный
2. сервер смотрит что такого файла нету, зато есть такой каталог
3. он отвечает "302 , ресурс был перемещен на УРЛ/"
4. Броузер делает второй запрос - уже правильный.

 А мой пример - дело в том, что для виртуальных каталогов это исправление не работает ;)
 Можете проверить на любом сервере Apache.
Название: Как получить путь без иени файла?
Отправлено: D1g174LM4n14c от 29 Мая 2003, 09:39:53
Oak
Все верно. Вот только если бы это поняли все... :(
Название: Как получить путь без иени файла?
Отправлено: Mаster от 29 Мая 2003, 10:35:26
А так не проще?

echo $_SERVER["HTTP_HOST"];
echo dirname($_SERVER["REDIRECT_URL"]);
?>
Название: Как получить путь без иени файла?
Отправлено: kosm от 29 Мая 2003, 11:16:57
Mаster
Да, интересный выход, но опять же мне не подойдет, т.к. я еще не на той странице, а только собираюсь туда пойти. УРЛ берется у меня из href...

Oak
Эт понятно. Но в моем случае нужно считать, что если нет расширения в конце урла, то это просто каталог, а если есть, то надо имя с расширением отсечь.

D1g174LM4n14c
Понятно. Но basename() не работает по класической схеме, т.е. смотрит на наличие слэша в конце урла, и опять же он решит, что "test" (из моего примера выше) - это файл, и выкусит его. :(

Кстати, интересно, вчера ф-ция, которую я выше описал - работала. А сегодня уже нет :) Странно как-то :)
Почему-то урл: http://www.host.ru/test
превращает в: http:/www.host.ru/test/ (двойной слэш портит).
Странно все это...
Название: Как получить путь без иени файла?
Отправлено: Mаster от 29 Мая 2003, 11:30:32
И что. Вот так незя сделать?

$url = "http://abracodabra.ru/path/to/page/index.php";
echo dirname($url);
?>
Название: Как получить путь без иени файла?
Отправлено: Mаster от 29 Мая 2003, 11:54:08
Можно ещё сделать так:


$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)."
";
}

?>
Название: Как получить путь без иени файла?
Отправлено: kosm от 29 Мая 2003, 12:18:12
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/ )

Не плохо он урл разложил, да? :) Чем он ему не понравился... ?
Название: Как получить путь без иени файла?
Отправлено: Alexandr от 29 Мая 2003, 12:26:59
pathinfo() returns an associative array containing information about path(а не урл). The following array elements are returned: dirname, basename and extension.

Для решения проблемы юзай parse_url + pathinfo
Название: Как получить путь без иени файла?
Отправлено: kosm от 29 Мая 2003, 12:55:25
С 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;
}
Название: Как получить путь без иени файла?
Отправлено: D1g174LM4n14c от 29 Мая 2003, 14:22:17
Цитировать
kosm:
Понятно. Но basename() не работает по класической схеме, т.е. смотрит на наличие слэша в конце урла, и опять же он решит, что "test" (из моего примера выше) - это файл, и выкусит его.

слеш \'/\' в конце игнорируетсяа dirname() и basename() ...
Название: Как получить путь без иени файла?
Отправлено: Alexandr от 29 Мая 2003, 16:05:47
Лучше так:

$path=rtrim($path, "/")."/";

вместо

if (substr($path,strlen($path)-1,1) != \'/\') {
$path = $path."/";
}
Название: Как получить путь без иени файла?
Отправлено: kosm от 02 Июня 2003, 10:42:04
Alexandr
Логично :) Спасибо! Эт я по старинке... ;)