Transform Relative Path Into Absolute URL Using PHP
function rel2abs($rel, $base) {
/* return if already absolute URL */
if (parse_url($rel, PHP_URL_SCHEME) != '') return $rel;
/* queries */
if ($rel[0] == '?') return explode("?", $base)[0] . $rel;
/* anchors */
if ($rel[0] == '#') return explode("#", $base)[0] . $rel;
/* parse base URL and convert to local variables: $scheme, $host, $path */
extract(parse_url($base));
/* Url begins with // */
if ($rel[0] == '/' && $rel[1] == '/') {
return "$scheme:$rel";
}
/* 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";
}
Testing ...
echo '<h4>Queries</h4>';
echo rel2abs("?query=1", "http://something.net/path/test.php");
echo '<br>';
echo rel2abs("?query=1", "http://something.net/path/test.php?old_query=1");
echo '<h4>Anchors</h4>';
echo rel2abs("#newAnchores", "http://something.net/path/test.php?a=1");
echo '<br>';
echo rel2abs("#newAnchores", "http://something.net/path/test.php?a=1#something");
echo '<h4>Path</h4>';
echo rel2abs("/testother.php", "http://something.net/folder1/folder2/folder3/test.php");
echo '<br>';
echo rel2abs("./../../testother.php", "http://something.net/folder1/folder2/folder3/test.php");
echo '<br>';
echo rel2abs("./../testother.php", "http://something.net/folder1/folder2/folder3/test.php");
echo '<br>';
echo rel2abs("./testother.php", "http://something.net/folder1/folder2/folder3/test.php");
echo '<br>';
echo rel2abs("testother.php", "http://something.net/folder1/folder2/folder3/test.php");
echo '<h4>Url begins with //</h4>';
echo rel2abs("//google.com/path/", "https://something.net/path/test.php");
echo '<br>';
echo rel2abs("//google.com/path/", "http://something.net/path/test.php");
Test Output ...
Queries
http://something.net/path/test.php?query=1
http://something.net/path/test.php?query=1
Anchors
http://something.net/path/test.php?a=1#newAnchores
http://something.net/path/test.php?a=1#newAnchores
Path
http://something.net/testother.php
http://something.net/folder1/testother.php
http://something.net/folder1/folder2/testother.php
http://something.net/folder1/folder2/folder3/testother.php
http://something.net/folder1/folder2/folder3/testother.php
Url begins with //
https://google.com/path/
http://google.com/path/
http://something.net/the current page domain ?top.php?kumar=1this are going tohttp://something.net/path/top.php?kumar=1right.top.php?kumar=1this are going tohttp://something.net/path/top.php?kumar=1and/testother.php?abhijit=1are go tohttp://something.net//testother.php?abhijit=1path are the headektop.php?kumar=1it is already goes to` OR it's must go to ... ?