PHP文章采集URL补全函数(FormatUrl)
程序员文章站
2022-09-10 16:41:13
写采集必用的函数,url补全函数,也可叫做formaturl。 写此函数作用就是为了开发采集程序,采集文章的时候会经常遇到页面里的路径是 “相对路径” 或者 “绝对根路径”...
写采集必用的函数,url补全函数,也可叫做formaturl。
写此函数作用就是为了开发采集程序,采集文章的时候会经常遇到页面里的路径是 “相对路径” 或者 “绝对根路径” 不是“绝对全路径”就无法收集url。
所以,就需要本功能函数进行对代码进行格式化,把所有的超链接都格式化一遍,这样就可以直接收集到正确的url了。
路径知识普及
相对路径:“../” “./” 或者前面什么都不加
绝对根路径:/path/xxx.html
绝对全路径:http://www.xxx.com/path/xxx.html
使用实例:
<?php
$surl="//www.jb51.net/";
$gethtm = '<a href="/index.htm">首页</a><a href="resolvent/index.htm">解决方案</a>';
echo formaturl($gethtm,$surl);
?>
输出:<a href="//www.jb51.net/index.htm">首页</a><a href="//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正则表达式的地方。在这里留个链接,防止丢失。。。
写此函数作用就是为了开发采集程序,采集文章的时候会经常遇到页面里的路径是 “相对路径” 或者 “绝对根路径” 不是“绝对全路径”就无法收集url。
所以,就需要本功能函数进行对代码进行格式化,把所有的超链接都格式化一遍,这样就可以直接收集到正确的url了。
路径知识普及
相对路径:“../” “./” 或者前面什么都不加
绝对根路径:/path/xxx.html
绝对全路径:http://www.xxx.com/path/xxx.html
使用实例:
复制代码 代码如下:
<?php
$surl="//www.jb51.net/";
$gethtm = '<a href="/index.htm">首页</a><a href="resolvent/index.htm">解决方案</a>';
echo formaturl($gethtm,$surl);
?>
输出:<a href="//www.jb51.net/index.htm">首页</a><a href="//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正则表达式的地方。在这里留个链接,防止丢失。。。
上一篇: 尊重艺术