这几天想将html中的相对地址转换成绝对地址,于是上网google了一下,找到了几个php的转换函数,发现处理得不是很完美,有些不能够处理链接中没有引号的url,有些将#开头的也转换成绝对地址,于是自己开始修改,研究了preg_replace函数和php正则表达式,得到下面的转换代码,分享下,希望能够帮助到大家。

以下代码将html中的相对地址转换成绝对地址,使用到了php正则表达式和preg_replace,可以将html中的链接, 图像, javascript和表单提交地址全部转换成绝对地址(除了以#开头的链接,因为是html内部自己的链接,就没有做绝对地址处理),都通过了测试,有什么问题可以在评论中反映。
function real_url($url,$URI) {
$URI_PARTS = parse_url($URI);
$pnum = substr_count($url,”../”);
if(substr($url,0,1) == “/”) $url =
preg_replace(“`(.+://.+?)/.*`”,”$1$url”,$URI);
if($pnum>0) {
for($i=0;$i< ($pnum+1);$i++) {
$URI = dirname($URI);
}
$url = str_replace(“../”,”",$url);
$url = $URI.”/”.$url;
}
else
{
if(substr_count($url,”:”)<1)
{
if($url==”.”)
$url=$URI;
else
$url=dirname($URI).’/’.$url;
}
}
//将./替换成空
$url = str_replace(“./”,”",$url);
return $url;
}

function RelativeURLToAbsoulteURL($html,$URI)
{
//将\’,\”,”,’引号的链接,改成双引号
$html=preg_replace(“~(<[^>]*)(src|href|action)=(\”|\\\\\”|’|\\\\’)([^\s]+)(\”|\\\\\”|’|\\\\’)~Uis”,”$1$2=\”$4\”",$html);
//将没有加引号的链接,加上双引号
$html=preg_replace(“~(<[^>]*)(src|href|action)=([^\"]+)([\s|>])~Uis”,”$1$2=\”$3\”$4″,$html);

//处理相对地址处理成绝对地址,并且可以处理#,..,.类型的地址
$html=preg_replace(“~(<[^>]*)(src|href|action)=\”([^#][^:]*)\”~Uise”,”‘$1$2=\”‘.real_url(‘$3′,’$URI’).’\”‘”,$html);
return $html;
}

//测试
$URI=”http://www.convertzone.com/1/2/3/4/test.htm”;
$html=’
other website
home
index
two
three
test bookmark
one bookmark
‘;
$result=RelativeURLToAbsoulteURL($html,$URI);

echo $result;
?>

, , ,