note 76682 added to function.parse-url

From: Date: Wed, 25 Jul 2007 21:58:40 +0000
Subject: note 76682 added to function.parse-url
Groups: php.notes 
Request: Send a blank email to php-notes+get-128931@lists.php.net to get a copy of this message
Here's a function which implements resolving a relative URL according to RFC 2396 section 5.2. No doubt there are more efficient implementations, but this one tries to remain close to the standard for clarity. It relies on a function called "unparse_url" to implement section 7, left as an exercise for the reader (or you can substitute the "glue_url" function posted earlier). <?php /** * Resolve a URL relative to a base path. This happens to work with POSIX * filenames as well. This is based on RFC 2396 section 5.2. */ function resolve_url($base, $url) { if (!strlen($base)) return $url; // Step 2 if (!strlen($url)) return $base; // Step 3 if (preg_match('!^[a-z]+:!i', $url)) return $url; $base = parse_url($base); if ($url{0} == "#") { // Step 2 (fragment) $base['fragment'] = substr($url, 1); return unparse_url($base); } unset($base['fragment']); unset($base['query']); if (substr($url, 0, 2) == "//") { // Step 4 return unparse_url(array( 'scheme'=>$base['scheme'], 'path'=>$url, )); } else if ($url{0} == "/") { // Step 5 $base['path'] = $url; } else { // Step 6 $path = explode('/', $base['path']); $url_path = explode('/', $url); // Step 6a: drop file from base array_pop($path); // Step 6b, 6c, 6e: append url while removing "." and ".." from // the directory portion $end = array_pop($url_path); foreach ($url_path as $segment) { if ($segment == '.') { // skip } else if ($segment == '..' && $path && $path[sizeof($path)-1] != '..') { array_pop($path); } else { $path[] = $segment; } } // Step 6d, 6f: remove "." and ".." from file portion if ($end == '.') { $path[] = ''; } else if ($end == '..' && $path && $path[sizeof($path)-1] != '..') { $path[sizeof($path)-1] = ''; } else { $path[] = $end; } // Step 6h $base['path'] = join('/', $path); } // Step 7 return unparse_url($base); } ?> ---- Server IP: 209.41.74.194 Probable Submitter: 207.207.18.227 ---- Manual Page -- http://www.php.net/manual/en/function.parse-url.php Edit -- https://master.php.net/note/edit/76682 Del: integrated -- https://master.php.net/note/delete/76682/integrated Del: useless -- https://master.php.net/note/delete/76682/useless Del: bad code -- https://master.php.net/note/delete/76682/bad+code Del: spam -- https://master.php.net/note/delete/76682/spam Del: non-english -- https://master.php.net/note/delete/76682/non-english Del: in docs -- https://master.php.net/note/delete/76682/in+docs Del: other reasons-- https://master.php.net/note/delete/76682 Reject -- https://master.php.net/note/reject/76682 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#128931) next »