php относительные URL-адреса для абсолютного преобразования URL-адресов с в конечном итоге базовым href html-тегом

У меня есть страница с DOM, тогда я хочу преобразовать все относительные URL-адреса привязок в абсолютные URL-адреса в соответствии с, в конце концов, <base href>

Я ищу что-то проверенное, а не какой-то случайный скрипт, который не срабатывает в некоторых случаях

Меня интересует разбор всех форм использования href = "":

 href="relative.php" href="/absolute1.php" href="./relative.php" href="../relative.php" href="//absolutedomain.org" href="." relative href=".." relative href="../" relative href="./" relative 

и более сложные смешанные

заранее спасибо

 <?php //Converting relative urls into absolute urls | PHP Tutors $base_url = 'http://www.xyz.com/ '; $anchors[0] = '<a href="test1.php" >Testing Link1 </a >'; $anchors[1] = '<a href="test2.php" >Testing Link2 </a >'; foreach($anchors as $val) { if(strpos($val,$base_url) === false) { echo str_replace('href="','href="'.$base_url,$val)."<br/ >"; } else { echo $val."<br/ >"; } } ?> 

Справка

Эта функция будет разрешать относительные URL-адреса для заданного текущего URL-адреса страницы в $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-адресе).

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