简单Spider类

 更新时间:2016年11月25日 15:16  点击:1465

<?php
class Spider {

var $mysql_host;
var $mysql_name;
var $mysql_pwd;
var $mysql_db;

var $parentUrl; //开始搜索的url
var $searchNum; //搜索的层数
var $url;
var $db;

//数据库连接函数
function connect_to_db($mysql_host,$mysql_name,$mysql_pwd){
$db=mysql_connect($mysql_host,$mysql_name,$mysql_pwd);
return $db;
}


//处理url,以符合标准
function dealUrl($url){
if(strstr($url,"http://")){

}else{
$url="http://".$url;
}
if(strrpos($url,'/')==strlen($url)-1){
$url = substr($url,0,-1);
}
return $url;
}

//取一个链接下的所有链接
function getUrl($url){
$fcontents = file($url);
$nextUrl = "succeed";
while(list(,$line)=each($fcontents)){

//while(eregi('(href[[:space:]]*=[[:space:]]*"?[[:alnum:]:@/._-] "?)(.*)',$line,$regs)){
while(eregi('(href[[:space:]]*=[[:space:]]*"?[[:alnum:]:@/._-] [^([:space:]|>|")]*)(.*)',$line,$regs)){
$regs[1] =
eregi_replace('(href[[:space:]]*=[[:space:]]*"?)([[:alnum:]:@/._-] )("?)',"2",$regs[1]);

if(strstr($regs[1],"http://")){
}else{
$regs[1]=$url."/".$regs[1];
}

//echo "&nbsp;&nbsp;&nbsp;&nbsp;$regs[1]<br>";
$line = $regs[2];
if(strstr($nextUrl,$regs[1])){

}else{
if(strstr($regs[1],".php")||strstr($regs[1],".asp")||strstr($regs[1],".jsp")||strstr($regs[1],".htm")||strstr($regs[1],".com")||strstr($regs[1],".cn")||strstr($regs[1],".net")||strstr($regs[1],".org")){
if(strstr($regs[1],"_bak")){

}else{
$nextUrl=$nextUrl.",".$regs[1];
}

}
}
}

}
return $nextUrl;
}


//查询该URL是否需要重新搜索
function queryUrl($url,$contentDesc,$db){
mysql_select_db("SearchEngine");
$sql="select * from visited where visitedUrl='".$url."' and contentDesc='".$contentDesc."'";
$rs=mysql_query($sql,$db);
if(mysql_fetch_row($rs)){
return false;
}else{
return true;

本款计数器用文本计数,没有用到数据库,可以实现如下功能:

  利用一个文本文件实现多个页的计数减少服务器的I/O占用率在需要纪录的文件里,只需加入很少的几行代码

  基本思路如下:

  服务器程序从文本文件中读取该页被浏览的次数,(因为所有文件向服务器提出请求时,他们的环境变量REQUEST_URI都代表他来自于何处... ...,所以,以请求文件的环境变量REQUEST_URI来辨别到底是那一页正被浏览。),将这个次数加一储存,并在调用这页的用户的计算机上显示出来。
请先看我的数据文本中纪录的数据样本,(红色为浏览次数,其前面为相应的被浏览的文件)

counter.php

<html>
<head>
<title>计数器</title>
<head>
<body>
<?php
/* 定义储存数据的文本文件 */
$counterFile="counter.dat";
/* 定义一个标记,用来辨别现在需纪录的数据是否已经文本数据中 */
$sign=False;
/* 将数据以数组的方式读入变量 $sounterData 备用, */
$counterData=file($counterFile);
/* 用count()函数计算共有多少个纪录 */
/* 用explode()函数把$counterData[$i]按符号"|"分开,并以数组的方式送回到变量$varArray里 */
/* 函数implode()与explode()刚刚相反,把数组$varArray以符号"|"连接起来送回到$counterData */
/* 还利用了环境变量$PATH_INFO
for($i=0;$i<=count($counterData)-1;$i )
 {
  $varArray=explode("|",$counterData[$i]);
  if ($varArray[0]==$GLOBALS["REQUEST_URI"])
   {
    $varArray[1] ;
    print($varArray[1]);
    $counterData[$i]=implode("|", $varArray);
    $sign=True;
    /* 找到本纪录所在的位置后, 用break 退出循环 */ 
    break;
   }
 }
/* 在这里,利用implode()这个函数的功能,将数据整理好了,一起写入文本文件中 */
/* 这样,对服务器的I/O占用就降到了最低点
$data=implode("",$counterData);
/* 打开文本文件,将数据写入 */
$fp=fopen($counterFile,"w");
fputs($fp,$data);
/* 假如需要纪录的数据不在文本里,标志$sign= Flase, 那么就往文本里添加数据 */
if (!$sign) {fputs($fp," ".$GLOBALS["REQUEST_URI"]."|"."1"."|");
print("1");
/* 关闭数据文件 */
fclose($fp);
?>
</body>
</html>

我们已经看到了这段程序的工作过程,也都知道了思路,但假如,每个文件里都这样写,岂不是太麻烦.
别慌! 我们还有PHP提供的强大的require()功能呢! 我们把counter.php写成函数,使用就方便许多了。那还等什么,下面就是你所要的函数:

counter.inc

PHP最有用的特性之一是它能够自动将表单中的变量值赋予PHP变量。这使得表单处理变得非常快捷。

因此,假如你送出一个内含输入栏位值的表单如下:

<INPUT TYPE=TEXT NAME="name" VALUE="Glen Morris">

当你用PHP处理此页面,$name变量的值就会是 Glen Morris。

因此,你可以用如下的方式把值打印出来:

echo "Hi $name!";

或者像这样测试其值:

if ($name == "Glen Morris") { echo "Please check your email."; }

这有一个用PHP处理基本表单的很好方法。例如,我们需要做一个简单的问卷调查,要求填写者必须填写他们的姓名,电子邮件地址,并回答一些我们感爱好的问题。

首先,我们会将页面拆成两个函数。因此,我们只需要写一个 PHP页面并用程序逻辑去控制对用户的显示内容就可以了,而不是写两个单独的网页(一个针对表单部分,另外一个针对处理表单的CGI脚本)。

显示表单
第一个函数用来显示表单:

<?php

functiondisplay_form() {

global $PHP_SELF;

?>

<FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>

Name: <INPUT TYPE=TEXT NAME="name"><BR>

Favorite Cheese: <INPUT TYPE=RADIO NAME="cheese" VALUE="brie">Very soft French Brie

<INPUT TYPE=RADIO NAME="cheese" VALUE="cheddar">Farmhouse English Cheddar

<INPUT TYPE=RADIO NAME="cheese" VALUE="mozzarella">Italian Buffalo Mozzarella

Favorite Times to Eat Cheese:

<INPUT TYPE=CHECKBOX NAME="times[]" VALUE="m">Morning

<INPUT TYPE=CHECKBOX NAME="times[]" VALUE="n">Noon

<INPUT TYPE=CHECKBOX NAME="times[]" VALUE="d">Dinner

<INPUT TYPE=CHECKBOX NAME="times[]" VALUE="l">Late night

<INPUT TYPE=HIDDEN NAME="stage" VALUE="results">

<INPUT TYPE=SUBMIT VALUE="Thanks!">

</FORM>

<?php

}

?>

介绍:

  我们可以通过程序来显示当前的数据。

  注重的两点:1.必须把下列代码放到扩展名为.PHP的文件中;2.在你的服务器上运行代码时,你的服务器必须支持MYSQL数据库。

  代码如下:

  下列代码放到你想显示信息的地方。

<?php

//EDIT THIS

$server = "localhost";

$db_user = "database username";

$db_pass = "database password";

$database = "database";

$timeoutseconds = 300;

//STOP EDITING

$timestamp = time();

$timeout = $timestamp-$timeoutseconds;

mysql_connect($server, $db_user, $db_pass);

$insert = mysql_db_query($database, "INSERT INTO useronline VALUES

('$timestamp','$REMOTE_ADDR','$PHP_SELF')");

if(!($insert)) {

print "Useronline Insert Failed > ";

}

$delete = mysql_db_query($database, "DELETE FROM useronline WHERE timestamp<$timeout");

if(!($delete)) {

print "Useronline Delete Failed > ";

}

$result = mysql_db_query($database, "SELECT DISTINCT ip FROM useronline WHERE file='$PHP_SELF'");

if(!($result)) {

print "Useronline Select Error > ";

}

$user = mysql_num_rows($result);

mysql_close();

if($user == 1) {

print("$usern");

} else {

print("$usern");

}

?>

  最后在MYSQL中修改你的 username 和 passwords

导读:
正则表达式在网络编程中的运用

[前言:]在我们编写WEB程序时,经常会判定一个字符串的有效性,如;一个串是否是数字、是否是有效的Email地址等等。假如不使用正则表达式,那么判定的程序会很长,并且轻易出错,假如使用正则表达式,这些判定就是一件很轻松的工作了。本文全面介绍正则表达式的慨念、格式。并以在PHP、ASP中的应用实例增加读者的感性熟悉。正则表达式的应用很广,需要大家在学习和实践中不断的总结。

正则表达式简介
简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。在网络编程中应用广泛,如PHP脚本语言或是JavaScript、VBScript这样的客户端脚本语言都提供了对正则表达式的支持。由此可见,正则表达式已经超出了某种语言或某个系统的局限,成为人们广为接受的概念和功能。

正则表达式可以让用户通过使用一系列的非凡字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。

举例来说,正则表达式的一个最为普遍的应用就是用于验证用户在线输入的邮件地址的格式是否正确,假如通过正则表达式验证用户邮件地址的格式正确,用户所填写的表单信息将会被正常处理;反之,假如用户输入的邮件地址与正则表达的模式不匹配,将会弹出提示信息,要求用户重新输入正确的邮件地址。由此可见正则表达式在WEB应用的逻辑判定中具有举足轻重的作用。在后面我们会举例具体介绍。

正则表达式形式一般如:/love/,其中位于"/"定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入"/"定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的"元字符"。所谓元字符就是指那些在正则表达式中具有非凡意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。较为常用的元字符包括: " ,"*,?以及{}",或者"s,S,d,w和W"等等。为了能够方便用户更加灵活的设定匹配模式,正则表达式答应使用者在匹配模式中利用[]界定匹配于某一个范围的字符而不局限于具体的字符。

除了我们以上的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。较为常用的定位符包括: "^", "$", "b" 以及 "B"。

假如我们希望在正则表达式中实现类似编程逻辑中的"或"运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 "|"。例如: 正则表达式中还有一个较为常用的运算符,即否定符 "[^]"。与我们前文所提到的定位符 "^" 不同,否定符 "[^]"规定目标对象中不能存在模式中所规定的字符串。一般来说,当"^"出现在 "[]"内时就被视做否定运算符;而当"^"位于"[]"之外,或没有"[]"时,则应当被视做定位符。

最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符""。例如:/Th*/,该正则表达式将会与目标对象中的"Th*"而非"The"等相匹配。

正则表达式的语法规则和标记
现在我们正式进入则表达式的学习,我会根据实例结合讲解正则表达式的用法,看完后你就会觉得写UBB代码如此简单了,只要你一步一步的跟着我学 看完本文章后你就成为UBB高手了。激动人心的就是你能写出自已的UBB标签来了,再也不用到别人那里去拷贝现成的代码和模板了。 还好VBScritp5.0给我们提供了"正则表达式"对象,只要你的服务器安装了IE5.x,就可以运行了.

字符描述:

^符号匹配字符串的开头。例如:
^abc 与"abc xyz"匹配,而不与"xyz abc"匹配

$符号匹配字符串的结尾。例如:
abc$ 与"xyz abc"匹配,而不与"abc xyz"匹配。

注重:假如同时使用^符号和$符号,将进行精确匹配。例如:
^abc$ 只与"abc"匹配 

*符号匹配0个或多个前面的字符。例如:
ab* 可以匹配"ab"、"abb"、"abbb"等

符号匹配至少一个前面的字符。例如:
ab  可以匹配"abb"、"abbb"等,但不匹配"ab"。

?符号匹配0个或1个前面的字符。例如:
ab?c? 可以且只能匹配"abc"、"abbc"、"abcc"和"abbcc"

.符号匹配除换行符以外的任何字符。例如:
(.)  匹配除换行符以外的所有字符串

x|y匹配"x"或"y"。例如:
abc|xyz 可匹配 "abc"或 "xyz",而"ab(c|x)yz"匹配 "abcyz"和"abxyz"

{n}匹配恰好n次(n为非负整数)前面的字符。例如:
a{2} 可以匹配"aa",但不匹配"a"

{n,}匹配至少n次(n为非负整数)前面的字符。例如:
a{3,} 匹配"aaa"、"aaaa"等,但不匹配"a"和"aa"。

[!--infotagslink--]

相关文章

  • php svn操作类

    以前我们开发大型项目时都会用到svn来同步,因为开发产品的人过多,所以我们会利用软件来管理,今天发有一居然可以利用php来管理svn哦,好了看看吧。 代码如下 ...2016-11-25
  • PHP 数据库缓存Memcache操作类

    操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
  • php简单数据操作的实例

    最基础的对数据的增加删除修改操作实例,菜鸟们收了吧...2013-09-26
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • Php文件上传类class.upload.php用法示例

    本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
  • PHP实现无限级分类(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
  • PHP实现递归无限级分类

    在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性。那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类。 递归,简单的说就是一段程序代码的重复调用,当把...2015-10-23
  • mybatis-plus实体类主键策略有3种(小结)

    这篇文章主要介绍了mybatis-plus实体类主键策略有3种(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-27
  • ecshop商品无限级分类代码

    ecshop商品无限级分类代码 function cat_options($spec_cat_id, $arr) { static $cat_options = array(); if (isset($cat_options[$spec_cat_id]))...2016-11-25
  • C#类中static变量用法分析

    这篇文章主要介绍了C#类中static变量用法,实例分析了static变量使用技巧与相关注意事项,需要的朋友可以参考下...2020-06-25
  • PHP 一个完整的分页类(附源码)

    在php中要实现分页比起asp中要简单很多了,我们核心就是直接获取当前页面然后判断每页多少再到数据库中利用limit就可以实现分页查询了,下面我来详细介绍分页类实现程序...2016-11-25
  • c#各种Timer类的区别与用法介绍

    System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。在必须更新用户界面的情况下,建议不要使用该计时器,因为它的回调不在用户界面线程上发生...2020-06-25
  • C#学习笔记整理_浅谈Math类的方法

    下面小编就为大家带来一篇C#学习笔记整理_浅谈Math类的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 详解ES6实现类的私有变量的几种写法

    这篇文章主要介绍了详解ES6实现类的私有变量的几种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
  • ES5和ES6中类的区别总结

    这篇文章主要给大家介绍了ES5和ES6中类的区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-21
  • Java匿名内部类的写法示例

    这篇文章主要给大家介绍了关于Java匿名内部类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-31
  • php无限分类使用concat如何实现

    一、数据库设计 -- -- Table structure for table `category` -- CREATE TABLE `category` ( `id` int(11) NOT NULL auto_increment, `catpath` varchar(255) default NULL, `name` varchar(255) default NULL...2015-11-08
  • 适用于初学者的简易PHP文件上传类

    本文实例讲述了PHP多文件上传类,分享给大家供大家参考。具体如下:<&#63;phpclass Test_Upload{ protected $_uploaded = array(); protected $_destination; protected $_max = 1024000; protected $_messages =...2015-10-30
  • JPA如何使用nativequery多表关联查询返回自定义实体类

    这篇文章主要介绍了JPA如何使用nativequery多表关联查询返回自定义实体类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-11-18
  • 浅谈C#中Process类的使用详解

    本篇文章是对C#中Process类的使用进行了详细的分析介绍,需要的朋友参考下...2020-06-25