PHP文章采集URL补全函数(FormatUrl)
2015-01-24信息快讯网
写此函数作用就是为了开发采集程序,采集文章的时候会经常遇到页面里的路径是 相对路径 或者 绝对根路径 不是 绝对全路径 就无法收集URL
写采集必用的函数,URL补全函数,也可叫做FormatUrl。写此函数作用就是为了开发采集程序,采集文章的时候会经常遇到页面里的路径是 “相对路径” 或者 “绝对根路径” 不是“绝对全路径”就无法收集URL。
所以,就需要本功能函数进行对代码进行格式化,把所有的超链接都格式化一遍,这样就可以直接收集到正确的URL了。
路径知识普及
相对路径:“../” “./” 或者前面什么都不加
绝对根路径:/path/xxx.html
绝对全路径:http://www.xxx.com/path/xxx.html
使用实例:
<?php $surl="http://www.jb51.net/"; $gethtm = '<a href="/index.htm">首页</a><a href="Resolvent/index.htm">解决方案</a>'; echo formaturl($gethtm,$surl); ?>
输出:<a href="http://www.jb51.net/index.htm">首页</a><a href="http://www.jb51.net/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\/\\\.\=\?\+\-~`@\':!%#]|(&)|&)+/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正则表达式的地方。在这里留个链接,防止丢失。。。
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
探讨GDFONTPATH能否被winxp下的php支持
Function eregi is deprecated (解决方法)
解析php中获取url与物理路径的总结
浅析使用Turck-mmcache编译来加速、优化PHP代码
解析smarty 截取字符串函数 truncate的用法介绍
解析php中die(),exit(),return的区别
php class中public,private,protected的区别以及实例分析
解析posix与perl标准的正则表达式区别
PHP的curl实现get,post和cookie(实例介绍)
深入PHP curl参数的详解
解析php curl_setopt 函数的相关应用及介绍
探讨:parse url解析URL,返回其组成部分
php一个找二层目录的小东东
PHP服务器页面间跳转实现方法
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
php中jQuery插件autocomplate的简单使用笔记
php中通过curl smtp发送邮件
php 函数中使用static的说明
PHP number_format() 函数定义和用法
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
PHP中return 和 exit 、break和contiue 区别与用法
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
JS中encodeURIComponent函数用php解码的代码
php中通过curl模拟登陆discuz论坛的实现代码
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
PHP CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发