Archive for the ‘PHP’ category

采集站代码整理:相对连接还原为完整连接的函数

March 2nd, 2011

在采集的时候,经常会遇到一些src=./abc.html,abc.html,../abc.html这样的形式的

print normalUrl(“./abc.html”,”http://www.trackself.com/abc/efg/a.html”);//输出http://www.trackself.com/abc/efg/abc.html

这个函数我测试了将近一小时了,大部分情况下还是可用的,但由于URL的多变性,应该也有不适用的可能(目前我没遇到)

function normalUrl($url,$comFrom){
//该函数将一个URL还原为完整形式
//一般来说要调用该函数,说明此URL并非以http开始,或者以./等为始
//$comFrom应该是该URL是从什么得来的
static $sc;//用于存放parse_url($comFrom),免得当大量URL时重复运算
$url=trim($url);
if(empty($url)){
return $url;
}
$purl=parse_url($url);
if(empty($purl['host'])){//此URL是不完整的
if(empty($sc[$comFrom])){
$sc[$comFrom]=parse_url($comFrom);
}
$purl['scheme']=$sc[$comFrom]['scheme'];
$purl['host']=$sc[$comFrom]['host'];
$fir=substr($url,0,1);
if($fir==”.”){
if(substr($url,0,2)==”./”){ //只处理只有一个./的情况
$str=substr($url,2);
$self=selfFolder($comFrom);
return $self.”/”.$str;
}elseif(substr($url,0,3)==”../”){
$str=substr($url,3);
$back=backFolder($comFrom);
return $back.”/”.$str;
}
}elseif($fir==”/”){
return $purl['scheme'].”://”.$purl['host'].$url;
}else{
$self=selfFolder($comFrom);
return $self.”/”.$url;
}
}else{
return $url;
}
}
function backFolder($url){
//后退一层目录:如:当http://wwww.trackself.com/abc/bcd/c.html,应该输出当http://wwww.trackself.com/abc/
static $result;
if(isset($result[$url])){
return $result[$url];
}
$self=selfFolder($url);
/*
$purl=parse_url($url);
if(empty($purl['path']) || $purl['path']==”/”){//这种情况几乎不出现,除非网站出错
return $url;
}
*/
$d=explode(“/”,$self);
array_pop($d);
$result[$url]=implode(“/”,$d);
return $result[$url];
}
function selfFolder($url){
//$url是一个完整的URL
//得到一个URL的目录结构:例如:当http://wwww.trackself.com/abc/bcd/c.html,应该输出当http://wwww.trackself.com/abc/bcd/
static $result;
if(isset($result[$url])){
return $result[$url];
}
$purl=parse_url($url);
$url=$purl['scheme'].”://”.$purl['host'].$purl['path'];
//$real=$purl['scheme'].”://”.$purl['host'].$purl['path'];//去掉了?以后的全部内容
if(empty($purl['path']) || strlen($purl['path'])<5){
//正常的html,至少是域名后有一个“/”然后有.html.htm.asp.php.pl,所以最少的长度应该是5.即/a.pl
//如果小于5,则基本可认为它是一个文件夹
$result[$url]=$url;
return $url;
}
$x=explode(“.”,$purl['path']);
if(count($x)<2){//没后辍,只能是文件夹
$result[$url]=$url;
return $url;
}
$y=array_pop($x);//取得可能是后辍的串
if(strlen($y)>5){//太长,一定不是正常文件
$result[$url]=$url;
return $url;
}
$ez=explode(“/”,$purl['path']);
$z=array_pop($ez);//取得最后一个可能是文件名的串
//对比$y,$z
if(strlen($y)>=strlen($z)){//文件名应该大于后辍
$result[$url]=$url;
return $url;
}
switch($y){
case “php”:
case “htm”:
case “jsp”:
case “html”:
case “asp”:
case “aspx”:
case “py”:
case “shtml”:
case “xml”:
case “rss”:
case “xhtml”:
$result[$url]=$purl['scheme'].”://”.$purl['host'].implode(“/”,$ez);
return $result[$url];
break;
}
$result[$url]=$url;
return $url;
}
Share

该函数将一个URL还原为完整形式

February 2nd, 2011
//$url=”/sites/all/themes/newswire/images/feed.png”;
$comFrom=”http://coedmagazine.com/tag/hand-bra/”;
function normalUrl($url,$comFrom){
//该函数将一个URL还原为完整形式
//一般来说要调用该函数,说明此URL并非以http开始,或者以./等为始
//$comFrom应该是该URL是从什么得来的
static $sc;//用于存放parse_url($comFrom),免得当大量URL时重复运算
$purl=parse_url($url);
if(empty($purl['host'])){//此URL是不完整的
if(empty($sc[$comFrom])){
$sc[$comFrom]=parse_url($comFrom);
}
$purl['scheme']=$sc[$comFrom]['scheme'];
$purl['host']=$sc[$comFrom]['host'];
return $purl['scheme'].”://”.$purl['host'].$purl['path'].(empty($purl['query'])?”":(“?”.$purl['query']));
}else{
return $url;
}
}
Share

一个提取图片URL或者连接URL的函数,parse image/link

February 2nd, 2011

用此函数,配合http://www.trackself.com/code/split.txt中的类则可将全文的图片连接或者全文的URL都找出来

例如:

$imageTag=”<img src=’http://google.com/1.jpg’  alt=’test’>”;

print_r(analyzeTag($imageTag,”src”));

$linkTag=”<a href=’http://google.com/’  alt=’test’>”;

print_r(analyzeTag($linkTag,”href”));

function analyzeTag($tagHtml,$co=”src”){

//该函数将<img .. src=xxx …>分开为三个部分,url,和其余部分

$url=”";

$result=array();

preg_match_all(“/”.$co.”\s*=\s*([\"\'])?(?(1)(.*?)\\1|([^\s\>]+))/isx”,$tagHtml,$ma);

$result=explode($ma[0][0],$tagHtml);

if(!empty($ma[2][0])){

$url=$ma[2][0];

}else{

$url=$ma[3][0];

}

$result[]=$url;

return $result;

}

Share

一个将HTML内容按图片img切开的类和函数

February 2nd, 2011
考虑一种情况:如果我们要将全文图片进行替换,而且交A图换为B,B图换为C……应该怎么去做
php的默认函数preg_split,返回的是不含关键字的数组,在某些情况下我们需要连这个关键字也一并返回
这个类或者函数的作用就在于此,但此类也能用于如将全文的连接换掉等等
用法请看连接中的代码,我写此类是为了写一个批量导入力图片的站
Share

discuz的加密办法不错

January 22nd, 2011

今天改PT程序(BT私有版),需要给每个用户生成一个唯一对应的数字。

突然想起该PT程序是drupal与discuz合并的,当时从discuz同步用户名给drupal的时候,discuz用了一个很奇特的加密方法,是discuz7.2才有的

$salt = substr(uniqid(rand()), -6);

此方法生成一个6位的随机数,非常好用。

我经常需要生成唯一对应的数字,以往使用的是rand(),但此方法不好的地方是全都是数字。

特此记下此法,以便以后调用

Share
1 2 3 »