У меня есть страница с 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-адресе).
Надеюсь это поможет,