存档

作者存档

不得不说的360金山门

2010年5月30日 没有评论

周鸿祎与金山之间的口水战还是战的不可开交,透过他们的周的口水炮弹,再次感受到了他的伟大人格魅力,赤裸裸的报复性的语言让我看清了他疯狂的报复心态,我感觉以前”迫害过”3721 的人是不是都头皮麻了一下,自认为一个人格端正的人是不会这样的,即便不相信金山网盾,但我宁愿相信可牛,和遨游,正式他们让我毫无犹豫的立刻卸载了360,这确实很恐怖,但一个软件控制了绝大部分电脑的时候,就像一个重磅炸弹,你不知道它什么时候就在你的电脑里爆炸。想当年3721在很多善良的国人心目中确实算是一个非常不错的软件,想上某一个网站的时候直接输入中文就行了,这是多么好的一款软件啊,为中国互联网也做出了不小的贡献,可是当它的狰狞面目露出来的时候,人们才恍然大悟,原来这款软件的背后竟是如此的肮脏龌龊不可告人。。。

顺便说句,最近电脑中了木马,经常刷新桌面时弹出网页广告窗口,用360杀了N遍,无效,在一个网友的推荐下用了下window的清理助手,成功解决,出现这种情况的网友不妨试试。

javascript 获取滚动条高度+常用js页面宽度与高度[转]

2010年5月20日 没有评论

/********************
* 取窗口滚动条高度
******************/
function getScrollTop()
{
var scrollTop=0;
if(document.documentElement&&document.documentElement.scrollTop)
{
scrollTop=document.documentElement.scrollTop;
}
else if(document.body)
{
scrollTop=document.body.scrollTop;
}
return scrollTop;
}

/********************
* 取窗口可视范围的高度
*******************/
function getClientHeight()
{
var clientHeight=0;
if(document.body.clientHeight&&document.documentElement.clientHeight)
{
var clientHeight = (document.body.clientHeight<document.documentElement.clientHeight)?document.body.clientHeight:document.documentElement.clientHeight;
}
else
{
var clientHeight = (document.body.clientHeight>document.documentElement.clientHeight)?document.body.clientHeight:document.documentElement.clientHeight;
}
return clientHeight;
}

/********************
* 取文档内容实际高度
*******************/
function getScrollHeight()
{
return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight);
}

////////////////////////////////////////////////////

在IE中:
document.body.clientWidth ==> BODY对象宽度
document.body.clientHeight ==> BODY对象高度
document.documentElement.clientWidth ==> 可见区域宽度
document.documentElement.clientHeight ==> 可见区域高度
在FireFox中:
document.body.clientWidth ==> BODY对象宽度
document.body.clientHeight ==> BODY对象高度
document.documentElement.clientWidth ==> 可见区域宽度
document.documentElement.clientHeight ==> 可见区域高度
?
在 Opera中:
document.body.clientWidth ==> 可见区域宽度
document.body.clientHeight ==> 可见区域高度
document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽)
document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高)
而如果没有定义W3C的标准,则
IE为:
document.documentElement.clientWidth ==> 0
document.documentElement.clientHeight ==> 0
FireFox为:
document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽)document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高)
Opera为:
document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽)document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高)
真是一件麻烦事情,其实就开发来看,宁可少一些对象和方法,不使用最新的标 准要方便许多啊。

//////////////////////////////////////////////////////////////////////////////////////

网页可见区域宽:
document.body.clientWidth

网页可见区域高:
document.body.clientHeight

网页可见区域宽:
document.body.offsetWidth(包 括边线的宽)

网页可见区域高:
document.body.offsetHeight(包括边线的宽)

网页 正文全文宽:
document.body.scrollWidth

网页正文全文高:
document.body.scrollHeight

网 页被卷去的高:
document.body.scrollTop

网页被卷去的左:
document.body.scrollLeft

网 页正文部分上:
window.screenTop

网页正文部分左:
window.screenLeft

屏 幕分辨率的高:
window.screen.height

屏幕分辨率的宽:
window.screen.width

屏 幕可用工作区高度:
window.screen.availHeight

屏幕可用工作区宽度:
window.screen.availWidth

分类: 学习笔记 标签: ,

smarty中使用fckeditor

2010年4月6日 没有评论

网上最常用的做法是先在php中调用fckeditor类的createHtml方法生成一段html,直接assign给一个samrty变量即可

这里我通过smarty的插件机制,可以更方便的在smarty中集成fckeditor,在smarty的plugin目录中新建文件function.fck.php

内容如下

<?php
function smarty_function_fck($params, &$smarty)
{
 if(!isset($params['InstanceName']) || empty($params['InstanceName']))
 {
  $smarty->trigger_error(‘fckeditor: required parameter “InstanceName” missing’);
 }

 static $base_arguments = array();
 static $config_arguments = array();

 if(!count($base_arguments))
  $init = TRUE;
 else
  $init = FALSE;

 if(isset($params['BasePath']))
 {
  $base_arguments['BasePath'] = $params['BasePath'];
 }
 else if(empty($base_arguments['BasePath']))
 {

//这里设置默认的fck所在的目录,相对于要使用fck的程序的目录
  $base_arguments['BasePath'] = ‘../plugins/fckeditor/’;
 }

 $base_arguments['InstanceName'] = $params['InstanceName'];

 if(isset($params['Value'])) $base_arguments['Value'] = $params['Value'];
 if(isset($params['Width'])) $base_arguments['Width'] = $params['Width'];
 if(isset($params['Height'])) $base_arguments['Height'] = $params['Height'];
 if(isset($params['ToolbarSet'])) $base_arguments['ToolbarSet'] = $params['ToolbarSet'];
 if(isset($params['CheckBrowser'])) $base_arguments['CheckBrowser'] = $params['CheckBrowser'];
 if(isset($params['DisplayErrors'])) $base_arguments['DisplayErrors'] = $params['DisplayErrors'];

 // Use all other parameters for the config array (replace if needed)
 $other_arguments = array_diff_assoc($params, $base_arguments);
 $config_arguments = array_merge($config_arguments, $other_arguments);

 $out = ”;

 if($init)
 {
  $out .= ‘<script type=”text/javascript” src=”‘ . $base_arguments['BasePath'] . ‘fckeditor.js”></script>’;
 }

 $out .= “\n<script type=\”text/javascript\”>\n”;
 $out .= “var oFCKeditor = new FCKeditor(‘” . $base_arguments['InstanceName'] . “‘);\n”;

 foreach($base_arguments as $key => $value)
 {
  if(!is_bool($value))
  {
   // Fix newlines, javascript cannot handle multiple line strings very well.
   $value = ‘”‘ . preg_replace(“/[\r\n]+/”, ‘” + $0″‘, addslashes($value)) . ‘”‘;
  }
  $out .= “oFCKeditor.$key = $value; “;
 }

 foreach($config_arguments as $key => $value)
 {
  if(!is_bool($value))
  {
   $value = ‘”‘ . preg_replace(“/[\r\n]+/”, ‘” + $0″‘, addslashes($value)) . ‘”‘;
  }
  $out .= “oFCKeditor.Config[\"$key\"] = $value; “;
 }

 $out .= “\noFCKeditor.Create();\n”;
 $out .= “</script>\n”;

 return $out;
}
?>

使用代码

{fck InstanceName=”body”  BasePath=“../plugins/fckeditor/” Value=$news_info.body Width=”100%” Height=”400″}
可以自定义参数 ToolbarSet-使用的工具栏, BasePath-fck相对于当前脚本的目录,InstanceName-要赋予的$_POST变量名, Value-默认值等

ubuntu 服务器中修改mysql数据目录的方法

2010年3月8日 没有评论

停止mysql服务
sudo /etc/init.d/mysql stop

建新数据库目录
mkdir /media/hda11/db

复制linux下原数据到新目录下
cp  -r  /var/lib/mysql/* /media/hda11/db

给新目录重命属性(很 重要,不然出现无法访问目录情况)
chown mysql:mysql  /media/hda11/db

修改 配置文件
sudo nano /etc/mysql/my.cnf

datadir = /var/mysql换成datadir = /media/hda11/db

#在my.cnf中有提到如果修改了 datadir这几部分,最好也调整/etc/apparmor.d/usr.sbin.mysqld

修改文件 /etc/apparmor.d/usr.sbin.mysqld(似乎跟安全配置有关)

sudo nano /etc/apparmor.d/usr.sbin.mysqld

/var/lib/mysql r,
/var/lib/mysql/** rwk,

改成
/media/hda11/db r,
/media/hda11/db/** rwk,

再开服务器(这一步很重要)
sudo /etc/init.d/apparmor restart

重启mysql服务
sudo /etc/init.d/mysql restart

附:apparmor也是个权限控制的东东。。

参考文章:http://forum.ubuntu.org.cn/viewtopic.php?f=44&p=1074517

有关IIS下zencart的伪静态设置

2010年1月16日 没有评论

公司的zencart 项目放在了window2003的服务器上,为了seo的考虑,开启了搜索引擎优化模块,可是碰到了一个问题,url的伪静态是通过网站根目录下的.htaccess文件来实现的,这需要apache的rewrite模块,可是iis中怎么实现?其实可以通过iis的ISAPI_Rewrite扩展来实现,下载一个ISAPI Rewrite的安装包,Lite免费版本ISAPI_Rewrite Lite (freeware)即可。安装运行后,打开IIS,在网站单击右键选属性,就可以看到ISAPI_Rewrite已经被加入到了ISAPI筛选器中。在ISAPI_Rewrite的安装目录下,找到 httpd.ini 在此文件中输入Rewrite的规则即可,这里的规则基本跟apache的rewrite差不多,不过在我的测试过程中,发现了一些问题,例如http.ini中不能使用%{QUERY_STRING}这样的服务器变量,也不知道是不是我服务器配置的原因,这里我对 zencart 里的.htaccess文件需要经过一些修改解决了这个问题

RewriteRule ^(.*)-p-(.*).html$ index\.php?main_page=product_info&products_id=$2&%{QUERY_STRING} [L]

修改为,无非是一个简单的正则替换

RewriteRule ^(.*)-p-(.*).html(\?(.*))?$ index\.php?main_page=product_info&products_id=$2&$4 [L]

有关zen cart集成支付宝借口时提示ILLEGAL_SIGN 错误解决

2010年1月8日 6 条评论

这次开发zencart的过程中要用过国内大名鼎鼎的支付宝接口,从zencart.cn上下了jack的 zen cart 支付宝模块从后台安装一切ok,可是测试购物的时候遇到了 ILLEGAL_SIGN错误,找了很多答案,仔仔细细看了阿里提供的api文档,还是找不出问题所在。看来得靠自己了,对着firebug,一个个核对网站传输给支付宝的post数据,发现多了 btn_submit.x,btn_submit.x 这两个参数,我把form 的method改成get,从地址栏中去掉这两个参数再打开,成功转向支付宝收银台页面,看来果然是两个参数搞得鬼!
google了下submit.x,得到如下答案
根据图形提交按钮行为W3C的描述 :

When a pointing device is used to click on the image, the form is submitted and the click coordinates passed to the server.
当指针设备用于在图像上点击,表单提交和点击坐标传递给服务器。

The x value is measured in pixels from the left of the image, and the y value in pixels from the top of the image.
在x值的单位是像素从左边的形象,以像素为单位从图像的顶部y值。

The submitted data includes name.x=x-value and name.y=y-value where “name” is the value of the name attribute, and x-value and y-value are the x and y coordinate values, respectively.
提交的数据包括name.x = x值和name.y = y值在“名称”的名称属性值和x值和y值是x和y坐标值。

于是这还是W3C的标准,现在的问题就是如何避免浏览器“多此一举”了,很简单,在表单添加onsubmit=”this.submit();return false;”,即修改zencart的订单确认页面模板tpl_checkout_confirmation_default.php文件中的

echo zen_draw_form(‘checkout_confirmation’, $form_action_url, ‘post’, ‘id=”checkout_confirmation” onsubmit=”submitonce();”‘);

修改为

echo zen_draw_form(‘checkout_confirmation’, $form_action_url, ‘post’, ‘id=”checkout_confirmation” onsubmit=”this.submit();return false;”‘);

关于css 绝对/相对定位 absolute与relative

2009年12月2日 1 条评论

一个朋友问过我css的定位属性中,absolute与relative到底有什么区别?我们都知道absolute是绝对定位,relative是相对定位,但是这个绝对与相对是什么意思呢?但是他们绝对和相对又是参照什么基点来的呢?

position:absolute; 他的意思是绝对定位,他是参照浏览器的左上角,配合TOP、RIGHT、BOTTOM、LEFT是个属性(简称TRBL)进行定位,在没有设定TRBL,默认依据父级的坐标原始点为基点(注意,仅仅是父级,而不是祖父级、曾祖父级。。),如果设定TRBL并且父级没有设定position属性,那么当前的absolute则以浏览器左上角作为基点参照TRBL属性进行定位,此时对象不再具有外补丁( margin ),但仍有内补丁( padding )和边框( border )。

position:relative; 他的意思是相对定位,他是参照父级的原始点为原始点,无父级则以文本流的顺序在上一个元素的底部为原始点,配合TRBL进行定位,当父级内有padding等CSS属性时,当前级的原始点则参照父级内容区的原始点进行定位,此时对象不可层叠,即设置z-index属性无用。

分类: 学习笔记 标签: ,

自己制作的umd电子书thinking in java中文版下载

2009年11月28日 1 条评论

先说下这本书确实很不错,先是因为朋友的推荐,下了电子版,立即被其中深入透彻的内容吸引了,然后从当当买了纸质的,这也是我买过的最贵的几本书之一了,后来为了方便在上下班路上用手机阅读,又自己根据电子版的pdf文件转成了txt格式的,无奈txt格式的没有目录结构,阅读查找起来实在是很不方便,于是又弄成了umd格式的,目录做到了每一章,呵呵,因为涉及到文件切割,编码问题,这个umd还是花了不少时间,当然好东西怎能一个人分享呢,下面是下载地址,喜欢的朋友可以留个脚印。
Think in java中文版

强大的php魔术,类方法的overload,cakephp中findby的实现

2009年11月19日 1 条评论

今天又摸了下cakephp,突然想研究一下cakephp中modle所提供的findbyfieldname..这样的方法,深入研究了一下,又发现了php的一个新技能!这确实是一个很有魔力的东西,简单代码如下

class OverLoadable{
//这个方法,当调用类中不存在的的方法时会调用这个方法,php自动把这个不存在的方法名和这个方法里的变量数组填充进这个方法并自动调用,于是我要findbyUsername时, 我就可以简单的通过正则提取出方法名中的Username这个字符串,然后传递给类中真正存在的方法findbyfield($field),这样就间接的实现了findbyUsername方法
于是这里,我就可以通过正则提出出方法名
function __call($method, $params){
if(preg_match(“/findby(?P.*)/i”,$method,$preg))
return $this->findbyfield($preg['field']);
}

function findbyfield($field)
{
echo $field;
}
//当读取类的成员变量不存在时,触发这个方法,以你要读取的变量名作为参数
function __get($name){
echo “Your val is $name,and is not exsit in this class!”;
}
//当写入类的成员变量不存在时,触发这个方法,以你要写入的变量名和值作为参数
function __set($name,$value){
echo ‘Your val is ‘.$name.’=>’.$value;
}
}

$oo = new OverLoadable();
$oo->findbyusername();
$oo->i = 5;
?>

php采集类

2009年10月29日 没有评论

一个自己写的php采集类,充分利用正则的强大字串处理能力,使用简单,功能也比较简单,能满足一般应用,功能也在不断完善中,使用过程:设置一个初始url,添加导航规则,添加采集字段和规则,保存输出即可

使用代码如下

$spider  = new spider();
$spider->addStartUrl(‘http://www.onlinedown.net/hits/week_{2,3}.htm’);
$spider->addLayer(0,’list’,’../soft/{*}.htm’);
$spider->addField(‘title’,'<title>{title}</title>’,array(‘华军软件园’,'安风信息网’));
$spider->run();
$spider->output();

上面采集的是华军软件的一周软件排行
源码如下

set_time_limit(0);
header("Content-type: text/html; charset=utf-8");
/**
* 采集程序类
* @author shooting
* @version 1.0.0
*/
class spider
{

/**
* 采集的终端页地址
*
* @var array
*/
var $pages = array();
/**
* 采集结果
*
* @var array
*/
var $result = array();
/**
* 第一层链接页面
*
* @var array
*/
var $startUrls = array();
/**
* 超时时间
*
* @var integer
*/
var $timeout;
/**
* 正在处理的文件内容
*
* @var string
*/
var $httpContent;
/**
* 正在处理的文件头
*
* @var array
*/
var $httpHead=array();
/**
* 自定义的head数组
*
* @var array
*/
var $putHead = array();
/**
* 采集字段与规则数组
*
* @var array
*/
var $field_arr = array();
/**
* 采集层次数
*
* @var interger
*/
var $deep;
/**
* 采集层次结构
*
* @var array
*/
var $layout_arr = array();
/**
* 采集限制条数
*
* @var integer
*/
var $limit = 0;

/**
* 程序运行时间
*
* @var float
*/
var $runtime = 0;

/**
* 被采集页面编码
*
* @var string
*/
var $charset = 'UTF-8';
/**
* 页面引用地址
*
* @var string
*/
var $httpreferer;

var $pagelimit = 0;

var $filepath = './';

function spider()
{
$this->timeout = 30;
}
/**
* 运行采集
*
* @return array
*/
function run()
{
$begintime = $this->microtime_float();
$cnt = 1;
foreach ($this->startUrls as $starturl){
/**
* 解析出起始地址中的页码区间
*/
if(preg_match(“~\{(\d+),(\d+)\}~”,$starturl,$pagenum)){
$pagebegin = intval($pagenum[1]);
$pageend = intval($pagenum[2]);
for(;$pagebegin<=$pageend;$pagebegin++){
$starturl = str_replace($pagenum[0],$pagebegin,$starturl);
$urllists = $this->getLists($this->layout_arr[0]['pattern'],$this->getContent($starturl));
foreach ($urllists as $url){
if(($this->limit > 0 && $cnt <= $this->limit)||$this->limit == 0)
{
$this->filterContent($this->getContent($url,$starturl));
$cnt++;
}
}
}
}else{
$urllists = $this->getLists($this->layout_arr[0]['pattern'],$this->getContent($starturl));
foreach ($urllists as $url){
if(($this->limit > 0 && $cnt <= $this->limit)||$this->limit == 0)
{
$this->filterContent($this->getContent($url,$starturl));
$cnt++;
}
}
}
}
$this->runtime = $this->microtime_float()-$begintime;
return $this->result;
}

/**
* 从文字段中根据规则提取出url列表
*
* @param string $pattern
* @param string $content
* @return Array
*/
function getLists($pattern=”,$content=”)
{
if(strpos($pattern,’{*}’) === false)return array($pattern);
$pattern = preg_quote($pattern);
$pattern = str_replace(‘\{\*\}’,'([^\'\">]*)’,$pattern);
$pattern = “~”.$pattern.”~is”;
preg_match_all($pattern,$content,$preg_rs);
return array_unique($preg_rs[0]);
}

/**
* 获取指定url的html内容包括头
*
* @param string $url
* @return string
*/
function getContent($url,$referer = ”)
{
$url = $this->urlRtoA($url,$referer);
preg_match(“/(http:\/\/)([^:\/]*):?(\d*)(\/?.*)/i”,$url,$preg_rs);
$host = $preg_rs[2];
$port = empty($preg_rs[3])?80:$preg_rs[3];
$innerUrl = $preg_rs[4];

$fsp = fsockopen($host,$port,$errno,$errstr,$this->timeout);
if(!$fsp)$this->log($errstr.’(‘.$errno.’)');
$output = “GET $url HTTP/1.0\r\nHost: $host\r\n”;
if(!isset($this->putHead['Accept']))$this->putHead['Accept']= “*/*”;
if(!isset($this->putHead['User-Agent']))$this->putHead['User-Agent']=’Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)’;
if(!isset($this->putHead['Refer'])){
$this->putHead['Refer'] = ($referer == ”)?’http://’.$host:$referer;
}
foreach ($this->putHead as $headname => $headvalue){
$output .= trim($headname).’: ‘.trim($headvalue).”\r\n”;
}

$output .= “Connection: close\r\n\r\n”;
fwrite($fsp,$output);

$content = ”;
while (!feof($fsp)) {
$content .= fgets($fsp,256);
}
fclose($fsp);

$this->getHead($content);
$this->httpContent = $content;
if(strtoupper($this->charset) != ‘UTF-8′){
$content = iconv($this->charset,’utf-8′,$content);
}else if(!empty($this->httpHead['charset']) && $this->httpHead['charset']!=’UTF-8′)
{
$content = iconv($this->httpHead['charset'],’utf-8′,$content);
}
$this->httpreferer = $referer;
return $content;
}

/**
* 按照规则从内容提取所有字段
* @param Array
* @return Array
*/
function filterContent($content=”)
{
$rs = array();
foreach ($this->field_arr as $field => $fieldinfo){
$rs[$field] = $this->getPregField($fieldinfo,$content);
}
$this->result[] = $rs;
}
/**
* 相对路径转化为绝对路径
*
* @param string $relative
* @param string $referer
* @return string
*/
function urlRtoA($relative,$referer)
{
/**
* 去除#后面的部分
*/
$pos = strpos($relative,’#');
if($pos >0)$relative = substr($relative,0,$pos);
/**
* 检测路径如果是绝对地址直接返回
*/
if(preg_match(“~^(http|ftp)://~i”,$relative))
return $relative;
/**
* 解析引用地址,获得协议,主机等信息
*/
preg_match(“~((http|ftp)://([^/]*)(.*/))([^/#]*)~i”, $referer, $preg_rs);
$parentdir = $preg_rs[1];
$petrol = $preg_rs[2].’://’;
$host = $preg_rs[3];
/**
* 如果以/开头的情况
*/
if(preg_match(“~^/~i”,$relative))
return $petrol.$host.$relative;
return $parentdir.$relative;
}

/**
* 根据规则提取一个字段
*
* @param string $pattern
* @param string $content
* @return string
*/
function getPregField($fieldinfo,$content)
{
/**
* 规则为固定值的情况,直接返回固定值
*/
if(strpos($fieldinfo['pattern'],’{‘.$fieldinfo['field'].’}') === false)
return $fieldinfo['pattern'];
if($fieldinfo['isregular'] == ‘true’){
$pattern = $fieldinfo['pattern'];
$pattern = str_replace(‘{‘.$fieldinfo['field'].’}',’(?P<'.$fieldinfo['field'].'>.*?)’,$pattern);
}else{
$pattern = preg_quote($fieldinfo['pattern']);
$pattern = str_replace(‘\{‘.$fieldinfo['field'].’\}’,'(?P<'.$fieldinfo['field'].'>.*?)’,$pattern);
}
$pattern = “~”.$pattern.”~is”;
preg_match($pattern,$content,$preg_rs);
$fieldresult = $preg_rs[$fieldinfo['field']];
/**
* 去掉换行符
*/
$fieldresult = preg_replace(“~[\r\n]*~is”,”,$fieldresult);
/**
* 对采集到的结果根据规则再进行二次替换处理
*/
$replace_arr = $fieldinfo['replace'];
if(is_array($replace_arr)){
$replace_arr[0] = “~”.$replace_arr[0].”~s”;
$fieldresult = preg_replace($replace_arr[0],$replace_arr[1],$fieldresult);
}
/**
* 针对有下一页的字段递归采集
*/
if($this->pagelimit == 0){
if($fieldinfo['nextpage'] != ”){
$pattern = $fieldinfo['nextpage'];
$pattern = str_replace(‘{nextpage}’,'(?P[^\'\">]*?)’,$pattern);
$pattern = “~”.$pattern.”~is”;
if(preg_match($pattern,$content,$preg_rs) && $preg_rs['nextpage'] != ”){
$fieldresult .= $this->getPregField($fieldinfo,$this->getContent($preg_rs['nextpage'],$this->httpreferer));
}
}
}
if(!empty($fieldinfo['callback']))$fieldresult = $fieldinfo['callback']($fieldresult);
return $fieldresult;
}
/**
* 添加一个采集字段和规则
*
* @param string $field
* @param string $pattern
*/
function addField($field,$pattern,$replace_arr=”,$isregular=’false’,$nextpage = ”,$callback=”)
{
$rs = array(
‘field’ => $field,
‘pattern’ => $pattern,
‘replace’ => $replace_arr,
‘isregular’ => $isregular,
‘nextpage’ => $nextpage,
‘callback’=>$callback
);
$this->field_arr[$field] =$rs;
}
/**
* 输出
*
*/
function output()
{
echo “The result is:
“;
echo “runtime :$this->runtime S

";
		print_r($this->result);
		echo "

“;
}
/**
* 输出到XLS文件
*
* @param string $file
*/
function saveXls($file = ‘spider_result.xls’)
{
$fp = fopen($file,’w');
if($fp){
foreach ($this->result as $result)
{
$line = implode(“\t”,$result).”\n”;
fputs($fp,$line);
}
}
fclose($fp);
echo ‘The result has been saved to ‘.$file.’.
Cost time:’.$this->runtime;
}

function saveSql($table = ‘spider_result’,$file = ‘spider_result.sql’)
{
$fp = fopen($file,’w');
if($fp){

foreach($this->field_arr as $fieldinfo){
$sql_key .= ‘, `’.$fieldinfo['field'].’`';
}
$sql_key = substr($sql_key,1);
foreach ($this->result as $result)
{
$sql_value = array();
foreach ($result as $key => $value){
$sql_value[] = “‘”.$this->addslash($value).”‘”;
}
$line =”INSERT INTO `$table` ( $sql_key ) VALUES (“.join(‘, ‘,$sql_value).”);\r\n”;
fputs($fp,$line);
}
}
fclose($fp);
echo ‘The result has been saved to ‘.$file.’.
Cost time:’.$this->runtime;
}
/**
* 取得响应内容的头部信息
*
* @param string $content
* @return array
*/
function getHead($content)
{
$head = explode(“\r\n\r\n”,$content);
$head = $head[0];
// echo $head;
if(!preg_match(“~charset\=(.*)\r\n~i”,$head,$preg_rs))
preg_match(‘~charset=([^\"\']*)~i’,$content,$preg_rs);
$this->httpHead['charset'] = strtoupper(trim($preg_rs[1]));
// preg_match(“~charset\=(.*)~i”,$head,$preg_rs);
return $this->httpHead;
}
/**
* 设置采集页面的编码
* 在程序不能自动识别的情况下采集前要手动调用此函数
*
* @param string $charset
*/
function setCharset($charset){
$this->charset = strtoupper($charset);
}

/**
* 设置第一层链接页面地址
*
* @param array $url_arr
*/
function setStartUrls($url_arr)
{
$this->startUrls = $url_arr;
}

/**
* 增加一个第一层链接页面地址
*
* @param string $url
*/
function addStartUrl($url)
{
$this->startUrls[] = $url;
}
/**
* 添加一个采集层次
*
* @param integer $deep
* @param string $layout
* @param boolean $isSimple
* @param boolean $isPageBreak
* @param string $pattern
*/
function addLayer($deep,$layout,$pattern = ”,$isSimple = ‘false’,$isPageBreak = ‘false’)
{
$this->layout_arr[$deep] = array(
‘layout’=>$layout,
‘isSimple’=>$isSimple,
‘isPageBreak’=>$isPageBreak,
‘pattern’=>$pattern );

}

/**
* 自定义head
* @param string $namespace
* @param string $value
*/
function setHead($name,$value)
{
$this->putHead[$name] = $value;
}

/**
* 清除html代码
* @param string $content;
* @param string $cleartags
* @return string
*/
function clearHtml($content,$cleartags = ‘div’)
{
$cleartags_arr = explode(‘|’,$cleartags);

foreach ($cleartags_arr as $cleartag){
$pattern = ‘~<\/?'.$cleartag.'[^>]*>~is’;
$content = preg_replace($pattern,”,$content);
}
return $content;
}
/**
* 日志
*
*/
function log($str)
{
echo $str.”
\n”;
}
/**
* 获取采集运行时间
*
* @return float
*/
function getRuntime()
{
return $this->runtime;
}

function microtime_float()
{
list($usec, $sec) = explode(” “, microtime());
return ((float)$usec + (float)$sec);
}

function addslash($string)
{
return addslashes($string);
}
}

$spider = new spider();
$spider->addStartUrl(‘http://hi.baidu.com/shuntian/blog/index/{0,5}’);
$spider->setCharset(‘gb2312′);
$spider->addLayer(0,’list’,'/shuntian/blog/item/{*}.html’);
$spider->addField(‘title’,’‘,array(‘_顺者的天空-shooting's sky ‘,”));
$spider->addField(‘body’,’

{body}

‘);
$spider->addField(‘author’,'shooting’);
$spider->run();
$spider->saveSql();