>>> 帝国网站管理系统5.1开源测试版下载
帝国CMS进入开源时代
 帝国论坛技术交流区网络编程文章采集URL补全函数:formaturl 【本版专题贴子】  
主题:文章采集URL补全函数:formaturl [加入收藏夹]   

hicode
用户头衔:版主

精华贴   :1
发贴数   :11333
经验值   :24627
注册时间:2007-07-20
信息 搜索 好友 发送悄悄话 开源第一波:帝国备份王2008开源版发布】   [第 1 楼]
文章采集URL补全函数:formaturl
作者:Lukin

Lukin原创作品,欢迎转载,请保留本页链接。

文章原文:http://hi.baidu.com/lukin/blog/item/a82df3039c21fded09fa93c9.html

写采集必用的函数,URL补全函数,也可叫做FormatUrl。

写此函数作用就是为了开发采集程序,采集文章的时候会经常遇到页面里的路径是 “相对路径” 或者 “绝对根路径” 不是“绝对全路径”就无法收集URL。

所以,就需要本功能函数进行对代码进行格式化,把所有的超链接都格式化一遍,这样就可以直接收集到正确的URL了。

路径知识普及
相对路径:“../” “./” 或者前面什么都不加
绝对根路径:/path/xxx.html
绝对全路径:http://www.xxx.com/path/xxx.html

使用实例:



<?php
$surl="http://www.7lian.com/";
$gethtm = '<a href="/index.htm">首页</a><a href="Resolvent/index.htm">解决方案</a>';
echo formaturl($gethtm,$surl);
?>
输出:<a href="http://www.7lian.com/index.htm">首页</a><a href="http://www.7lian.com/Resolvent/index.htm">解决方案</a>




<?php
function formaturl($l1,$l2){
if (preg_match_all("/(<img[^>]+src=\"([^\"]+)\"[^>]*>)|(<a[^>]+href=\"([^\"]+)\"[^>]*>)|(<img[^>]+src='([^']+)'[^>]*>)|(<a[^>]+href='([^']+)'[^>]*>)/i",$l1,$regs)){
     foreach($regs[0] as $num => $url){
      $l1 = str_replace($url,lIIIIl($url,$l2),$l1);
     }
}
return $l1;
}
function lIIIIl($l1,$l2){
if(preg_match("/(.*)(href|src)=(.+?)( |/>|>).*/i",$l1,$regs)){$I2 = $regs[3];}
if(strlen($I2)>0){
     $I1 = str_replace(chr(34),"",$I2);
     $I1 = str_replace(chr(39),"",$I1);
}else{return $l1;}
$url_parsed = parse_url($l2);
$scheme     = $url_parsed["scheme"];if($scheme!=""){$scheme = $scheme."://";}
$host     = $url_parsed["host"];
$l3      = $scheme.$host;
if(strlen($l3)==0){return $l1;}
$path     = dirname($url_parsed["path"]);if($path[0]=="\"){$path="";}
$pos     = strpos($I1,"#");
if($pos>0) $I1 = substr($I1,0,$pos);

//判断类型
if(preg_match("/^(http|https|ftp):(//|\\)(([w/\+-~`@:%])+.)+([w/\.=?+-~`@':!%#]|(&)|&)+/i",$I1)){return $l1; }//http开头的url类型要跳过
elseif($I1[0]=="/"){$I1 = $l3.$I1;}//绝对路径
elseif(substr($I1,0,3)=="../"){//相对路径
     while(substr($I1,0,3)=="../"){
      $I1 = substr($I1,strlen($I1)-(strlen($I1)-3),strlen($I1)-3);
      if(strlen($path)>0){
       $path = dirname($path);
      }
     }
     $I1 = $l3.$path."/".$I1;
}
elseif(substr($I1,0,2)=="./"){
     $I1 = $l3.$path.substr($I1,strlen($I1)-(strlen($I1)-1),strlen($I1)-1);
}
elseif(strtolower(substr($I1,0,7))=="mailto:"||strtolower(substr($I1,0,11))=="javascript:"){
     return $l1;
}else{
     $I1 = $l3.$path."/".$I1;
}
return str_replace($I2,"\"$I1\"",$l1);
}
?>




2007-07-21 09:18:39 已设置保密 顶部 回复 引用 报告 编辑 删除

wm_chief
用户头衔:管理员

精华贴   :21
发贴数   :47888
经验值   :109431
注册时间:2002-10-30
信息 搜索 好友 发送悄悄话 《帝国网站管理系统》零基础实例入门教程】   [第 2 楼]

这个不错



[零基础入门教程] [模板制作教程] [采集使用教程]
2007-07-21 09:24:07 已设置保密 顶部 回复 引用 报告 编辑 删除

快速回复
内容

表情
使用EBB代码 使用smile代码 显示签名 自动分析url 自动分析img
     【进入高级模式】   (按 Ctrl+Enter 直接提交)
    顶部  加入收藏夹
关于帝国 | 广告服务 | 联系我们 | 法律声明 | 隐私条款 | 许可协议
Powered by: EBB Version 2.2.1