Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Преобразование url в абсолютный. (Дмитрий Эсс)
Author Message
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Sun Apr 25, 2004 10:32 am ()
   Post subject: Преобразование url в абсолютный.
Reply with quote

Как проще всего преобразовать относительный url в абсолютный.
Имеется:
1. абсолютный url страницы;
2. относительный url к файлу, прописанный в коде этой страницы.
Надо получить:
Абсолютный url к файлу.

Есть ли стандартная функция для этого (я не нашёл)? Если нет, то как это сделать наименьшим количеством телодвижений?
Что сразу приходит в голову:
1. если адрес файла начинается с "/", то присоединять его к хосту и всё;
2. если нет, то соединить url страницы и url файла и пропустить результат через realpath(), потом взять подстроку от "http" и до конца и сделать в ней небольшие преобразования, т.к., допустим, код
Code (php): скопировать код в буфер обмена
echo (www.php.net/echo) realpath (www.php.net/realpath)("http://php.net/manual/test/../test.php")
печатает
Quote:
d:\home\test\www\http:\php.net\manual\test.php
Думаю, можно и проще.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Sun Apr 25, 2004 11:43 am (спустя 1 час 11 минут)
   Post subject:
Reply with quote

Дмитрий Эсс wrote:
Думаю, можно и проще.
www.php.net/parse_url ?
Back to top
View user's profile Send private message Send e-mail
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Sun Apr 25, 2004 12:39 pm (спустя 56 минут)
   Post subject:
Reply with quote

yUAC:
Можно конкретнее? Что мне это даст?
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Sun Apr 25, 2004 1:17 pm (спустя 37 минут)
   Post subject:
Reply with quote

Да нет, наверное я был не прав, он скорее всего не превращает пути в абсолютные. А так - им можно отрезать порт, протокол, и использовать realpath более рационально. Если бы это был именно этот сайт, то вообще элементарно - можно получать абсолютный URL этого сайта, превращать в путь до файла, и потом отрезать DOCUMENT_ROOT
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 415
   поощрить/наказать


PostPosted: Sun Apr 25, 2004 1:58 pm (спустя 40 минут)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
<?
require_once "File/Path.php";

// Glossary
// --------
// Relative: path relative to calling file (contains #include virtual)
// Url:      path relative to DOCUMENT_ROOT
// Path:     filesystem path

class SSI_Tools {

        function getAbsUrl($url) {
                $curUrl = isset (www.php.net/isset)($_SERVER["DOCUMENT_URI"])?
                        $_SERVER["DOCUMENT_URI"] :
                        $_SERVER["SCRIPT_NAME"];
                $curUrl = dirname (www.php.net/dirname)($curUrl);
                $url = File_Path::absPath(trim (www.php.net/trim)($url), $curUrl);
                return $url;
        }

        // Отличие от CGI_Tools::url2Path() в том, что используется $DOCUMENT_URI,
        // а не $SCRIPT_NAME.
        function url2Path($url) {
                return File_Path::gluePath($_SERVER["DOCUMENT_ROOT"], SSI_Tools::getAbsUrl($url));
        }
}
?>
Code (php): скопировать код в буфер обмена
<?php
//**
//** Some filepath related tools.
//**

class File_Path {
        var $VERSION = "1.10";

        // Returns the absolute path.
        function absPath($name, $cur=false) {
                // Glue full name.
                if ($cur === false) $cur = getcwd (www.php.net/getcwd)();
                if (!File_Path::isAbsolute($name))
                        $name = File_Path::gluePath($cur, $name);
                $orig = preg_split (www.php.net/preg_split)("{[/\\\\]}s", $name);
                $absolute = File_Path::isAbsolute($name);
                // Delete ".." and "." parts.
                $parts = array (www.php.net/array)();
                foreach ($orig as $e) {
                        if ($e == ".")         continue;
                        else if ($e == "..") {
                                $size = sizeof (www.php.net/sizeof)($parts);
                                if ($size > 1) array_pop (www.php.net/array_pop)($parts);
                                else if (!$absolute) $parts = array (www.php.net/array)(".");
                        }
                        else $parts[] = $e;
                }
                // Process root separately.
                if (!sizeof (www.php.net/sizeof)($parts)) return ".";
                if ($absolute && sizeof (www.php.net/sizeof)($parts)==1 && $parts[0] === "") return "/";
                return implode (www.php.net/implode)("/", $parts);
        }

        // Glues two pathes avoiding slashes duplicates.
        // Also normalizes slashes (converts to "/").
        function gluePath($dir, $fname) {
                $all = $dir."/".$fname;
                $all = preg_replace (www.php.net/preg_replace)("{[\\\\//]+}s", "/", $all);
                $all = preg_replace (www.php.net/preg_replace)("{/$}s", "", $all);
                return $all;
        }

        // Returns true if the path is absolute.
        function isAbsolute($path) {
                return preg_match (www.php.net/preg_match)("{^(\w:)?[/\\\\]}s", $path);
        }

        // Creates directory structure.
        function mkdirs($strPath, $mode) {
                if (file_exists (www.php.net/file_exists)($strPath) && is_dir (www.php.net/is_dir)($strPath)) return true;
                $pStrPath = dirname (www.php.net/dirname)($strPath);
                if (!File_Path::mkdirs($pStrPath, $mode)) return false;
                return mkdir (www.php.net/mkdir)($strPath);
        }

}
?>
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Sun Apr 25, 2004 2:31 pm (спустя 33 минуты)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
File_Path::absPath
Так можно писать в PHP4 ?
Back to top
View user's profile Send private message Send e-mail
7.3.
Участник форума



Joined: 01 Nov 2003
Posts: 1142
Карма: 37
   поощрить/наказать


PostPosted: Sun Apr 25, 2004 2:45 pm (спустя 13 минут)
   Post subject:
Reply with quote

yUAC wrote:
Так можно писать в PHP4 ?
Да. Еще в классе DeltaRussian тоже самое было.
Back to top
View user's profile Send private message
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Sun Apr 25, 2004 4:35 pm (спустя 1 час 50 минут)
   Post subject:
Reply with quote

Дмитрий Котеров:
Спасибо, буду смотреть.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 415
   поощрить/наказать


PostPosted: Sun Apr 25, 2004 5:27 pm (спустя 52 минуты)
   Post subject:
Reply with quote


М

Перенесено из форума: Программирование::PHP::Все в кучу.
Перенесено в форум: Программирование::PHP::Склад готовых решений.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 415
   поощрить/наказать


PostPosted: Mon Apr 26, 2004 9:50 pm (спустя 1 день 4 часа 22 минуты)
   Post subject:
Reply with quote

ru.php.net/realpath

Много интересного можно прочитать в пользовательских комментариях.

I've tested several examples given by other ppls but none were working, at least on windows. so I spent time and wrote my own function for realpath( ) replacement that will work with non-existing paths also.

...

This function is kind of reversed version of realpath. It takes
canonical ("absolute") path to a filename, $pic, and returns path
relative to the script's directory.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 415
   поощрить/наказать


PostPosted: Wed Apr 28, 2004 4:37 pm (спустя 1 день 18 часов 46 минут)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Преобразование url в абсолютный.»,
расположенную в форуме Программирование::PHP::Все в кучу (28 Апреля 2004, 17:37).
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML