百度空间 | 百度首页 
               
 
查看文章
 
PHP版,文章采集URL补全函数:formaturl
2007年04月20日 星期五 00:35

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

发表到喜悦国际村了:http://www.phpx.com/happy/thread-133301-1-1.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>

---------    演示实例    ------------
原始路径代码:http://www.newnew.cn/newnewindex.aspx
输出演示代码:http://www.maifp.com/aaa/test.php

-------------------------------------以下是函数代码--------------------------------------------------
<?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\/\\\.\=\?\+\-~`@\':!%#]|(&amp;)|&)+/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);
}
?>
-------------------------------------以上是函数代码--------------------------------------------------

下面的链接是学习PHP正则表达式的地方。在这里留个链接,防止丢失。。。

http://www.cublog.cn/u/27731/showart.php?id=252746


类别:Php Script | 添加到搜藏 | 浏览() | 评论 (9)
 
最近读者:
 
网友评论:
1
2007年04月23日 星期一 01:20 | 回复
我还以是要自己判断的,原来找有函数了,这函数是你搞的吗
 
2
2007年04月23日 星期一 01:39 | 回复
函数是我自己写的,不过是参考kingcms.com的函数代码(asp的代码)翻译来的。 先分析kingcms.com里面的asp源码思想,然后根据他的写出来的php版本的。
 
3
2007年04月25日 星期三 23:23 | 回复
这个代码在kingcms的哪个页面呀?我也想了解~ 目前做简繁转换服务器,需要精致地转换所有链接,一个都不能漏,包括css、js及任何文本文件里的路径! 觉得相当复杂~
 
4
2007年04月25日 星期三 23:44 | 回复
刚试了一下,还是不行,JS里有些提取不出来!
 
5
2007年04月26日 星期四 01:33 | 回复
这个是针对html代码里的链接,不是针对js里面的链接,肯定提取不了,连googlebot都提取不了 我当然也没那个能力了!
 
6
2007年04月26日 星期四 02:08 | 回复
额~但是哪些繁简通都可以转化出来,不知道是怎么弄得。 对了,我问一下~ 我用了kingcms那三个函数,可是很奇怪,有些能转换有些不能转换! 比如:http://www.jusny.com/test.asp?url=http://www.nicoljiang.com/ 这样的问题真的让人很是郁闷啊!
 
7
2007年04月26日 星期四 09:26 | 回复
这个你要多学学正则表达式,他的正则表达式不一定全部正确。 你分析一下他的正则表达式吧!
 
8
2007年04月26日 星期四 13:30 | 回复
表达式我粗略看了下好像没问题,而且我拿了一些较短的代码测试,都可以解析好,比如你的那段,还有单引号什么的。 但一旦从网上获取内容,就开始出问题了,而且是有的地址换了,有的地址却没换,而html代码明明是一样的! 比如一个导航,可能第一个被换了,但后面的就没换!这让我相当不能理解~
 
9
2008年12月12日 星期五 16:36 | 回复
if(preg_match("/^(http|https|ftp):(\/\/|\\\\)(([\w\/\\\+\-~`@:%])+\.)+([\w\/\\\.\=\?\+\-~`@\':!%#]|(&)|&)+/i",$I1)){return $l1; }//http开头的url类型要跳过 这个正则调试有错,匹配不到。麻烦看下哈.
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu