Intereting Posts
Форма ввода со скрытым полем, как ее защитить Вставка значений массива вставляет один идентификатор в базу данных mysql с использованием php и PDO ajax, как вернуть сообщение об ошибке из файла PHP Drupal 7 hook_node_view добавляет форму к содержимому узла Остановка кнопки «Назад» при открытии защищенных страниц? Рекурсивный просмотр всех каталогов серверов и список новейших созданных файлов с php Вставка из цикла for – добавление значения опции выбора только к одной записи Есть ли у PHP 5.x какой-то HashSet или Set Class? Подтвердить регулярное выражение для почтового индекса Канады Как найти целое слово в строке на PHP без случайных совпадений? Cakephp сохраняет дополнительный атрибут в отношении HABTM Лучшая практика в отношении одноэлементных классов PHP Как обеспечить дополнительную безопасность для проверки источника запроса Как сделать обратную ссылку на страницу разбиения на страницы вернуться к предыдущей странице разбиения на страницы Заполнение ассоциативных массивов

Передать относительный путь в абсолютный URL с помощью PHP

Как, используя php, преобразовать относительный путь к абсолютному URL?

    function rel2abs($rel, $base) { /* return if already absolute URL */ if (parse_url($rel, PHP_URL_SCHEME) != '') return $rel; /* queries and anchors */ if ($rel[0]=='#' || $rel[0]=='?') return $base.$rel; /* parse base URL and convert to local variables: $scheme, $host, $path */ extract(parse_url($base)); /* remove non-directory element from path */ $path = preg_replace('#/[^/]*$#', '', $path); /* destroy path if relative url points to root */ if ($rel[0] == '/') $path = ''; /* dirty absolute URL */ $abs = "$host$path/$rel"; /* replace '//' or '/./' or '/foo/../' with '/' */ $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#'); for($n=1; $n>0; $abs=preg_replace($re, '/', $abs, -1, $n)) {} /* absolute URL is ready! */ return $scheme.'://'.$abs; } 

    Мне нравится код, который предоставляется по ссылке! Я проголосовал за это. l0oky вдохновил меня на то, чтобы функция была совместима с портом, именем пользователя и паролем. Мне это было нужно для моего проекта.

     function rel2abs( $rel, $base ) { /* return if already absolute URL */ if( parse_url($rel, PHP_URL_SCHEME) != '' ) return( $rel ); /* queries and anchors */ if( $rel[0]=='#' || $rel[0]=='?' ) return( $base.$rel ); /* parse base URL and convert to local variables: $scheme, $host, $path */ extract( parse_url($base) ); /* remove non-directory element from path */ $path = preg_replace( '#/[^/]*$#', '', $path ); /* destroy path if relative url points to root */ if( $rel[0] == '/' ) $path = ''; /* dirty absolute URL */ $abs = ''; /* do we have a user in our URL? */ if( isset($user) ) { $abs.= $user; /* password too? */ if( isset($pass) ) $abs.= ':'.$pass; $abs.= '@'; } $abs.= $host; /* did somebody sneak in a port? */ if( isset($port) ) $abs.= ':'.$port; $abs.=$path.'/'.$rel; /* replace '//' or '/./' or '/foo/../' with '/' */ $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#'); for( $n=1; $n>0; $abs=preg_replace( $re, '/', $abs, -1, $n ) ) {} /* absolute URL is ready! */ return( $scheme.'://'.$abs ); } 

    Добавлена ​​поддержка для сохранения текущего запроса. Помогает много для? Page = 1 и так далее …

     function rel2abs($rel, $base) { /* return if already absolute URL */ if (parse_url($rel, PHP_URL_SCHEME) != '') return ($rel); /* queries and anchors */ if ($rel[0] == '#' || $rel[0] == '?') return ($base . $rel); /* parse base URL and convert to local variables: $scheme, $host, $path, $query, $port, $user, $pass */ extract(parse_url($base)); /* remove non-directory element from path */ $path = preg_replace('#/[^/]*$#', '', $path); /* destroy path if relative url points to root */ if ($rel[0] == '/') $path = ''; /* dirty absolute URL */ $abs = ''; /* do we have a user in our URL? */ if (isset($user)) { $abs .= $user; /* password too? */ if (isset($pass)) $abs .= ':' . $pass; $abs .= '@'; } $abs .= $host; /* did somebody sneak in a port? */ if (isset($port)) $abs .= ':' . $port; $abs .= $path . '/' . $rel . (isset($query) ? '?' . $query : ''); /* replace '//' or '/./' or '/foo/../' with '/' */ $re = ['#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#']; for ($n = 1; $n > 0; $abs = preg_replace($re, '/', $abs, -1, $n)) { } /* absolute URL is ready! */ return ($scheme . '://' . $abs); } 

    На самом деле не вопрос о преобразовании пути, а не url? PHP на самом деле имеет функцию для этого: realpath () . Единственное, о чем вы должны знать, это символические ссылки.

    Пример из руководства PHP:

     chdir('/var/www/'); echo realpath('./../../etc/passwd') . PHP_EOL; // Prints: /etc/passwd echo realpath('/tmp/') . PHP_EOL; // Prints: /tmp 

    Если относительная директория уже существует, это выполнит задание:

     function rel2abs($relPath, $baseDir = './') { if ('' == trim($path)) { return $baseDir; } $currentDir = getcwd(); chdir($baseDir); $path = realpath($path); chdir($currentDir); return $path; } 

    Эта функция разрешит относительный URL-адрес для заданного текущего URL- $pgurl страницы в $pgurl без регулярного выражения . Он успешно решает:

    /home.php?example типы,

    такие же типы nextpage.php ,

    ../...../.../parentdir ,

    полные URL-адреса http://example.net ,

    и сокращенные URL-адреса //example.net

     //Current base URL (you can dynamically retrieve from $_SERVER) $pgurl = 'http://example.com/scripts/php/absurl.php'; function absurl($url) { global $pgurl; if(strpos($url,'://')) return $url; //already absolute if(substr($url,0,2)=='//') return 'http:'.$url; //shorthand scheme if($url[0]=='/') return parse_url($pgurl,PHP_URL_SCHEME).'://'.parse_url($pgurl,PHP_URL_HOST).$url; //just add domain if(strpos($pgurl,'/',9)===false) $pgurl .= '/'; //add slash to domain if needed return substr($pgurl,0,strrpos($pgurl,'/')+1).$url; //for relative links, gets current directory and appends new filename } function nodots($path) { //Resolve dot dot slashes, no regex! $arr1 = explode('/',$path); $arr2 = array(); foreach($arr1 as $seg) { switch($seg) { case '.': break; case '..': array_pop($arr2); break; case '...': array_pop($arr2); array_pop($arr2); break; case '....': array_pop($arr2); array_pop($arr2); array_pop($arr2); break; case '.....': array_pop($arr2); array_pop($arr2); array_pop($arr2); array_pop($arr2); break; default: $arr2[] = $seg; } } return implode('/',$arr2); } 

    Пример использования:

     echo nodots(absurl('../index.html')); 

    nodots() необходимо вызвать после преобразования URL в абсолютный.

    Функция точек является излишней, но читается, быстро, не использует регулярные выражения и будет разрешать 99% типичных URL-адресов (если вы хотите быть на 100% уверенным, просто расширяйте блок переключателей, чтобы поддерживать 6+ точек, хотя Я никогда не видел столько точек в URL-адресе).

    Надеюсь это поможет,

    Я использовал тот же код из: http://nashruddin.com/PHP_Script_for_Converting_Relative_to_Absolute_URL, но я немного изменил его. Если базовый url содержит номер PORT, он возвращает относительный URL-адрес с номером порта в нем.

     function rel2abs($rel, $base) { /* return if already absolute URL */ if (parse_url($rel, PHP_URL_SCHEME) != '') return $rel; /* queries and anchors */ if ($rel[0]=='#' || $rel[0]=='?') return $base.$rel; /* parse base URL and convert to local variables: $scheme, $host, $path */ extract(parse_url($base)); /* remove non-directory element from path */ $path = preg_replace('#/[^/]*$#', '', $path); /* destroy path if relative url points to root */ if ($rel[0] == '/') $path = ''; /* dirty absolute URL // with port number if exists */ if (parse_url($base, PHP_URL_PORT) != ''){ $abs = "$host:".parse_url($base, PHP_URL_PORT)."$path/$rel"; }else{ $abs = "$host$path/$rel"; } /* replace '//' or '/./' or '/foo/../' with '/' */ $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#'); for($n=1; $n>0; $abs=preg_replace($re, '/', $abs, -1, $n)) {} /* absolute URL is ready! */ return $scheme.'://'.$abs; } 

    Надеюсь, это поможет кому-то!