PHP文章采集URL补全函数(FormatUrl)


Posted in PHP onAugust 02, 2012

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

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

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

<?php 
$surl="https://3water.com/"; 
$gethtm = '<a href="/index.htm">首页</a><a href="Resolvent/index.htm">解决方案</a>'; 
echo formaturl($gethtm,$surl); 
?>

输出:<a href="https://3water.com/index.htm">首页</a><a href="https://3water.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\/\\\.\=\?\+\-~`@\':!%#]|(&)|&)+/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 相关文章推荐
用PHP实现Ftp用户的在线管理的代码
Mar 06 PHP
php UBB 解析实现代码
Nov 27 PHP
php解析url的三个示例
Jan 20 PHP
PHP多态代码实例
Jun 26 PHP
PHP页面转UTF-8中文编码乱码的解决办法
Oct 20 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
PHP实现的登录页面信息提示功能示例
Jul 24 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
Oct 10 PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 PHP
Swoole实现异步投递task任务案例详解
Apr 02 PHP
PHP的静态方法与普通方法用法实例分析
Sep 26 PHP
php获取是星期几的的一些常用姿势
Dec 15 PHP
PHP服务器页面间跳转实现方法
Aug 02 #PHP
php中3des加密代码(完全与.net中的兼容)
Aug 02 #PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
Aug 01 #PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
Jul 31 #PHP
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
Jul 31 #PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
Jul 31 #PHP
php切割页面div内容的实现代码分享
Jul 31 #PHP
You might like
PHP实现的比较完善的购物车类
2014/12/02 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
2016/01/09 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
2017/03/13 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
为你的 Laravel 验证器加上多验证场景的实现
2020/04/07 PHP
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
angularjs 源码解析之injector
2016/08/22 Javascript
js手动播放图片实现图片轮播效果
2016/09/17 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
简单实现IONIC购物车功能
2017/01/10 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
微信小程序调用天气接口并且渲染在页面过程详解
2019/06/24 Javascript
关于layui flow loading占位图的实现方法
2019/09/21 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
python if not in 多条件判断代码
2016/09/21 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
python turtle 绘制太极图的实例
2019/12/18 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
2020/12/14 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
应届生服装设计自我评价
2013/09/20 职场文书
大学生的自我鉴定范文
2014/01/21 职场文书
《石榴》教学反思
2014/03/02 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
反腐倡廉观后感
2015/06/08 职场文书
同学聚会感言一句话
2015/07/30 职场文书
高三物理教学反思
2016/02/20 职场文书
使用python向MongoDB插入时间字段的操作
2021/05/18 Python