Home > PHP开发 | 371 views 十二月 29th, 2008
这 几天想将html中的相对地址转换成绝对地址,于是上网google了一下,找到了几个php的转换函数,发现处理得不是很完美,有些不能够处理链接中没 有引号的url,有些将#开头的也转换成绝对地址,于是自己开始修改,研究了preg_replace函数和php正则表达式,得到下面的转换代码,分享 下,希望能够帮助到大家。
以下代码将html中的相对地址转换成绝对地址,使用到了php正则表达式和preg_replace ,可以将html中的链接, 图像, javascript和表单提交地址全部转换成绝对地址(除了以#开头的链接,因为是html内部自己的链接,就没有做绝对地址处理),都通过了测试,有什么问题可以在评论中反映。
- <?php
- 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 = ‘
- <a href="http://www.google.com/help.htm">other website</a>
- <a href=/>home</a>
- <a href=/index.htm>index</a>
- <a href="../../index.htm">two</a>
- <a href= /’ .././index.htm /’ >three</a>
- <a href=#bookmark>test bookmark</a>
- <a href=../../../index.htm#bookmark>one bookmark</a>
- ‘ ;
- $result = RelativeURLToAbsoulteURL ( $html , $URI ) ;
- echo $result ;
- ?>