php采集入门教程,教你如何写采集
php采集入门教程,教你如何写采集
我们第一步是采集所有的连接,我们这个可不是简单的采集一篇文章哦,我们要做的是采集整本书,并且保存到一个文本,因为现在MP3普及了,都可以看电子书了。
一本书要怎么保存呢,当然是要用书名保存便于查找拉,我们先来采集这本书的标题,
先来看一下原形:
<meta name="description" content="诛仙(二),后金庸武侠圣经:诛仙2">
规律是:
<meta name="description" content="标题">
我们来写一下正则表达式吧,不要告诉我不会,不会就来湖南拉,嘿嘿很多大鸟的。
正则表达式:
<meta name="description" content="(.*?)">
下面开始开工拉!我们首先要获得资源,这里需要用到一个函数:
file_get_contents()
介绍:
主要功能:将整个文件读入一个字符串
原形是:string file_get_contents
( string filename [, bool use_include_path [, resource context [, int offset [, int maxlen]]]] )
具体什么意思呢,其实就是告诉你在某个资源内搜索符合规定的字符串并赋予给一个变量
上边是开始需要用到的,我们了解一点就开始写一点那样更能够深刻的理解并且能记住,我来分析下写程序的思路:
我们采集一个地址,不会是就采集一本书把所以我们的采集地址是变化的,变化的用什么呢?这个时候一个硕大的粉笔扔了过来,我不是告诉你了吗?变量,一个严厉的王建军老师,用尽了全身力气,汇集在粉笔上对我无情的扔了过来,我想哭。。。。。。。老师打人了!!!!!!!!打家来看啊。
用变量好的,那就用变量,我们获取地址,代码如下:
$url = "http://book.sina.com.cn/nzt/lit/zhuxian2/index.shtml";// 图书地址
有了上边讲的,现在应该可以完全写出来了,开始代码:
<?php
//****************************************************************
$url = "http://book.sina.com.cn/nzt/lit/zhuxian2/index.shtml";// 图书地址
$ver = "old"; //新旧版本
//因为图书他的页面又两种板式,所以我们要在这里区别一下
//****************************************************************
// 获取页面代码 file_get_contents() 把文件读入一个字符串,下边的时候需要用到
$r = file_get_contents($url);
//在上边获取的字符串中搜索标题,并赋值给变量$booktitle,$booktitle是数组,/is就凑活理解成开始吧!
preg_match("/<meta name="description" content="(.*?)">/is",$r,$booktitle);
//把第一个出现捕获的标题赋值给变量bookname。
$bookname = $booktitle[1]; //书名
//print_r ($booktitle);die();不理解的输出这个看看,嘿嘿,帮助大家理解
/*************************************************************************************
*原形:<li><a href=/nzt/lit/zhuxian2/1.shtml target=_blank class=a03>第四十五章 伤痛(1)</a>
*规律是:<li><a href=不固定.shtml target=_blank class=a03>不固定</a>
*ISU是正则的一种模式,该模式是非贪婪模式,也就是说只要匹配上就结束
*************************************************************************************/
$preg = '/<li><a href=(.*).shtml target=_blank class=a03>/isU';
/********************************************************************************
*preg_match_all进行全局正则表达式匹配
*原形:
*
int preg_match_all
*
( string pattern, string subject, array matches [, int flags] )
*意思是:在全局搜索资源变量$preg,得到一个数组赋值给一个变量$zj,这个变量也就是数组了。
*取得其中的资源的时候用标示就可以,不会的看下数组哦!
*汪老师说了,不会数组的给我出去啃书,什么时候会了进来
**********************************************************************************/
preg_match_all($preg, $r, $zj);
//print_r ($zj);die();不理解的输出这个看看,嘿嘿,帮助大家理解
// 计算标题数量,我是问了最后提示大家看又多少章节,采集了多少
$bookzj = count($zj[1]);
//判断你要采集的板式是那种哦,因为内容开始不一样哦,其实可以自动判断的,我也写成了,但是不发布,因为很简单
if ($ver=="new"){
$content_start = "<!--正文内容开始-->";
$content_end = "<!--正文内容结束-->";
}
if ($ver=="old"){
$content_start = "</table><!--NEWSZW_HZH_END-->";
$content_end = "<br>";
}
//采集后的文件,然后那来进行处理.这个是设置编码的,为什么是这个呢,因为你看下网站源码,嘿嘿!!!
header("Content-Type:text/html;charset=gb2312");
/*****************************************************************************************
*从1到136页的内容一次合并.这个是最爽的...打个版权,以免有人侵权,嘿嘿,好像我就在侵权哦!!!
*某某一定想杀人,这句意思就是写个版权,创建文件。
*****************************************************************************************/
writer($bookname." 共".$bookzj."节rn帅哥刘并于".date("D M j G:i:s T Y")."为了毕业而设计小说整理收集rn", "./ljy/".$bookname.".txt","w+");
/*****************************************************************************************
*从1到136页的内容一次合并.这个是最爽的...打个版权,以免有人侵权,嘿嘿,好像我就在侵权哦!!!
*某某一定想杀人,这句意思就是写个版权,创建文件。
*****************************************************************************************/
for ($i=0;$i<$bookzj;$i++) {//提示下:$bookzj里边是什么前边叫你输出了,不明自自己在看下
//echo "http://book.sina.com.cn".$zj[1][$i]".shtml";die();
$str = file_get_contents("http://book.sina.com.cn".$zj[1][$i].".shtml");
preg_match("/(<title>)(.*?)(</title>)/is",$str,$title);
$title = str_replace("_读书频道_新浪网","",preg_replace("/<(.*?)>/s","",$title[2]));
/***************************************************************************
*preg_replace执行正则表达式的搜索和替换
*str_replace用法真的不好说,就看例子吧!其实就是一个替换
* str = "abcabc".replace(/a/g, "d"); //结果为 dbcdbc
* str = "abcabc".replace(/a/, "d"); //结果为 dbcabc
***************************************************************************/
preg_match("/(".$content_start.")(.*?)(".$content_end.")/is",$str,$content);
$content = preg_replace("/<(.*?)>/s","",str_replace("</p>","rn",$content[2]));
$content = str_replace("
","",preg_replace("/^[s]*n/is","",$content));
$content = str_replace(" ? "," ",preg_replace("/^[s]*n/is","",$content));
$result = " rn第".($i+1)."节--------".$title."_汪老师就是帅 --------- rn".$content;
//var_dump ($result);die();
writer($result, "./ailaopo/".$bookname.".txt","a+");
echo "小说".$bookname."共".$bookzj."节,现在整理到第".$i."节 _".$title."<br>";
}
echo "小说".$bookname."共".$bookzj."节 已全部整理完成!";
function writer($content,$url,$mode)
{
$fp = fopen($url, $mode);
fwrite($fp, $content);
fclose($fp);
}
?>
php实用实例 采集远程网站图片保存到本地
先从文章中把所有<img ...> 用正则 抠出来. $message //文章内容
//正则(这个还不是)
$reg = "/<img[^>]*src="(http://(.+)/(.+).(jpg|gif|bmp|bnp))"/isU";
//把抠出来的 img 地址存放到 $img_array 变量中
preg_match_all($reg, $message, $img_array, PREG_PATTERN_ORDER);
//过滤重复的图片
$img_array = array_unique($img_array[1]);
复制代码第二步. 把$img_array 数组循环一下. 做图片保存和文章位置替换 foreach ($img_array as $img){
//判断是否是自己网站上的 图片
if('xxx.com' != get_domain($img)){// 如果这个图片不是自己服务器上的
//读取图片文件
$Gimg = new GetImage();
$Gimg->source = $img;
$Gimg->save_to = './data/temp/';
$FILE = $Gimg->download(); //图片移动到本地
//保存到相册 得到图片保存的位置
$img_path = pic_save($FILE,0,'');
//文本路径替换
$message = str_replace($img, $img_path, $message);
}
}
....这时候 $message 里面已经图片已经替换为自己服务器本地的地址,并且图片也保存到自己的服务器上.
复制代码//下面一个函数 和 类是从网络上找的.
//从url中获得域名
function get_domain($url){
$pattern = "/[w-]+.(com|net|org|gov|cc|biz|info|cn)(.(cn|hk))*/";
preg_match($pattern, $url, $matches);
if(count($matches) > 0) {
return $matches[0];
}else{
$rs = parse_url($url);
$main_url = $rs["host"];
if(!strcmp(long2ip(sprintf("%u",ip2long($main_url))),$main_url)) {
return $main_url;
}else{
$arr = explode(".",$main_url);
$count=count($arr);
$endArr = array("com","net","org","3322");//com.cn net.cn 等情况
if (in_array($arr[$count-2],$endArr)){
$domain = $arr[$count-3].".".$arr[$count-2].".".$arr[$count-1];
}else{
$domain = $arr[$count-2].".".$arr[$count-1];
}
return $domain;
}// end if(!strcmp...)
}// end if(count...)
}// end function
// 从远程吧图片载到服务器本地 的 类
class GetImage {
var $source;
var $save_to;
var $quality;
function download($method = 'curl') {
$info = @GetImageSize($this->source);
$mime = $info['mime'];
// What sort of image?
$type = substr(strrchr($mime, '/'), 1);
switch ($type){
case 'jpeg':
$image_create_func = 'ImageCreateFromJPEG';
$image_save_func = 'ImageJPEG';
$new_image_ext = 'jpg';
// Best Quality: 100
$quality = isSet($this->quality) ? $this->quality : 100;
break;
case 'png':
$image_create_func = 'ImageCreateFromPNG';
$image_save_func = 'ImagePNG';
$new_image_ext = 'png';
// Compression Level: from 0 (no compression) to 9
$quality = isSet($this->quality) ? $this->quality : 0;
break;
case 'bmp':
$image_create_func = 'ImageCreateFromBMP';
$image_save_func = 'ImageBMP';
$new_image_ext = 'bmp';
break;
case 'gif':
$image_create_func = 'ImageCreateFromGIF';
$image_save_func = 'ImageGIF';
$new_image_ext = 'gif';
break;
case 'vnd.wap.wbmp':
$image_create_func = 'ImageCreateFromWBMP';
$image_save_func = 'ImageWBMP';
$new_image_ext = 'bmp';
break;
case 'xbm':
$image_create_func = 'ImageCreateFromXBM';
$image_save_func = 'ImageXBM';
$new_image_ext = 'xbm';
break;
default:
$image_create_func = 'ImageCreateFromJPEG';
$image_save_func = 'ImageJPEG';
$new_image_ext = 'jpg';
}
if(isSet($this->set_extension)){
$ext = strrchr($this->source, ".");
$strlen = strlen($ext);
$new_name = basename(substr($this->source, 0, -$strlen)).'.'.$new_image_ext;
}else{
$new_name = basename($this->source);
}
$save_to = $this->save_to."/blog_insert_temp_".time().mt_rand(1,99).".".$new_image_ext;
//输出对象 组成跟$_FILE变量一样 得到后自己和平常图片上传处理一样了
$img_info['name'] = basename($this->source);
$img_info['type'] = $mime;
$img_info['size'] = 1000;
$img_info['tmp_name'] = $save_to;
$img_info['error'] = 0;
if($method == 'curl'){
$save_image = $this->LoadImageCURL($save_to);
}elseif($method == 'gd'){
$img = $image_create_func($this->source);
if(isSet($quality)){
$save_image = $image_save_func($img, $save_to, $quality);
}else{
$save_image = $image_save_func($img, $save_to);
}
}
return $img_info;
}
function LoadImageCURL($save_to){
$ch = curl_init($this->source);
$fp = fopen($save_to, "wb");
// set URL and other appropriate options
$options = array(CURLOPT_FILE => $fp,
CURLOPT_HEADER => 0,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_TIMEOUT => 60); // 1 minute timeout (should be enough)
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
fclose($fp);
}
}
php实用图片水印效果代码
<?php
define('Water',1);//水印方式(0,文字水印,1图片水印)
define('WaterImg','./water.jpg');//水印图片地址
define('WaterNum',0);//水印位置,0为随机,1-9分别为顶左顶中顶右中左中中中右底左底中底右
define('WaterX',81);//水印长
define('WaterY',81);//水印高
define('WaterType','image/jpeg');//水印图片类型
define('WaterText','爱搜罗');//水印文字(必须先转换成UTF-8才能实现中文水印)
define('WaterTextColor','#000000');//水印文字颜色
define('WaterTextSize',50);//水印文字大小 px
define('WaterTextFont','C:WINDOWSFontsSIMFANG.TTF');//水印文字字体 (仿宋)
define('WaterPtc',50);//水印透明度
//////////////////////水印默认设置完毕
class water
{
private $img;//图片地址
private $img_type;//图片类型
//private $img_mime;//图片实际类型
private $img_x;//图片长
private $img_y;//图片高
private $is_water;//是否可以添加水印,布尔
private $water_img;//水印图片
private $water_text;//图片文字(UTF-8)
private $water_num;//水印位置(可能用不着)
private $water_w = WaterX;//water的宽
private $water_h = WaterY ;//water的长
private $water_x;//水印的x位置
private $water_y;//水印的y位置
private $src_x;//画布与water两图的长度差
private $src_y;//画布与water两图的高度差
private $err_msg;//图片地址
public function __construct($img,$img_type)
{
if (file_exists($img) == FALSE)
{
$this->Err_Img('No_Img');
}
$this->img = $img;
$this->img_type = $img_type;//写入图片类型
$this->Check_GD();//检查GD库
$this->Do_Water();//判断水印方式
$this->Type_Img();//判断图片类型
}
/*
* 检查GD库
*/
public function Check_GD(){
if (function_exists("gd_info") == FALSE)
{
$this->Err_Img('No_Gd');
}
}
/*
* 处理水印方式及water文件类型
*/
public function Do_Water()
{
if (Water == 1)//图片水印
{
$this->Img_Water();//处理water图片
}else{//文字水印
$this->Text_xy();//处理文字水印图片
}
}
/*
* 处理water图片
*/
public function Img_Water()
{
if (file_exists(WaterImg) == FALSE)
{
$this->Err_Img('No_WaterImg');
//使用文字水印
}
switch (WaterType)
{
case 'image/jpeg':
$this->water_img = imagecreatefromjpeg(WaterImg);
break;
}
}
/*
* 获得文字的长宽 并 计算 两图的长宽差
*/
public function Text_xy()
{
$str = iconv('GB2312','UTF-8',WaterText);
$temp = imagettfbbox(50,0,WaterTextFont,$str);//取得使用 TrueType 字体的文本的范围
$w = $temp[2] - $temp[6];
$h = $temp[3] - $temp[7];
$this->src_x = $this->img_x - $w;
$this->src_y = $this->img_y - $h;
}
/*
* 判断图片是否能够添加水印,比较大小
*/
public function Is_Water()
{
if (Water == 1)//图片水印
{
$this->src_x = $this->img_x - WaterX;
$this->src_y = $this->img_y - WaterY;
if ($this->src_x <= 0 && $this->src_y <= 0)
{
$this->Err_Img('Too_Small');
}
}else{//文字水印
if ($this->src_x <= 0 && $this->src_y <=0)
{
$this->Err_Img('Too_Small');
}
}
}
/*
* 处理水印位置
* 得到 水印位置的坐标
*/
public function Water_Num()
{
switch(WaterNum)
{
case 0://随机
$this->water_x = rand(0,($this->img_x - $this->water_w));
$this->water_y = rand(0,($this->img_y - $this->water_h));
break;
case 1://顶端居左
$this->water_x = 0;
$this->water_y = 0;
break;
case 2://顶端居中
$this->water_x = ($this->img_x - $this->water_w)/2;
$this->water_y = 0;
break;
case 3://顶端居右
$this->water_x = $this->img_x - $this->water_w;
$this->water_y = 0;
break;
case 4://中间居左
$this->water_x = 0;
$this->water_y = ($this->img_y - $this->water_h)/2;
break;
case 5://中间居中
$this->water_x = ($this->img_x - $this->water_w)/2;
$this->water_y = ($this->img_y - $this->water_h)/2;
break;
case 6://中间居右
$this->water_x = $this->img_x - $this->water_w;
$this->water_y = ($this->img_y - $this->water_h)/2;
break;
case 7://底部居左
$this->water_x = 0;
$this->water_y = $this->img_y - $this->water_h;
break;
case 8://底部居中
$this->water_x = ($this->img_x - $this->water_w)/2;
$this->water_y = $this->img_y - $this->water_h;
break;
case 9://底部居右
$this->water_x = $this->img_x - $this->water_w;
$this->water_y = $this->img_y - $this->water_h;
break;
default://随机
$this->water_x = rand(0,($this->img_x - $this->water_w));
$this->water_y = rand(0,($this->img_y - $this->water_h));
}
}
/*
* 判断图片类型
*/
public function Type_Img()
{
switch ($this->img_type)
{
case 'image/jpeg':
header("Content-type: image/jpeg");
$this->img = imagecreatefromjpeg($this->img);
break;
}
$this->Img_Water();//处理water图片
$this->img_x = imagesx($this->img);
$this->img_y = imagesy($this->img);
$this->Water_Num();//判断水印位置
$this->Is_Water();
$this->Make_img();
}
/*
* 制作图片水印
*/
public function Make_img(){
imagecopymerge($this->img,$this->water_img,$this->water_x,$this->water_y,0,0,WaterX,WaterY,WaterPtc);
imagejpeg($this->img);
}
/*
* 制作文字水印
*/
public function Make_Text()
{
echo '测试';
}
/*
* 返回错误信息
*/
public function Err_Img($msg)
{
switch($msg)
{
case 'No_Gd':
$this->err_msg = '没有安装GD库';
break;
case 'No_Img':
$this->err_msg = '图片不存在';
break;
case 'No_WaterImg':
$this->err_msg = 'water图片不存在';
break;
case 'Too_Small':
$this->err_msg = '图片过小';
break;
}
die($this->err_msg);//输出错误信息
}
public function __destruct()
{
imagedestroy($this->img);
imagedestroy($this->img_water);
}
}
$img = new water('./100.jpg','image/jpeg');//实例化
?>
php 表单验证类
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>表单验证测试</title>
</head>
<body>
<h2>简易表单验证!</h2>
<div class="help" style="font-size:12px;color:grey">下面的例子已经够清楚了,如果需要自定义验证类型或者自定义验证表达式可以自定义函数:validate_myfun(需要验证的值,规则数组)<br />自定义表达式:_erun_myfun(要验证的值,规则数组,表达式数组)</div>
<div class="info" style="padding:10px;background:#ffc">
<?php
function validate_testa($value,$args){
if($value%2 == 0){
return array(false,$args['cname'].'输入错误,只能输入奇数!');
}else{
return array(true,null);
}
}
function _erun_testb($value,$args,$t){
if($value >= $t['setting']){
return array(false,$args['cname'].'只能输入小于'.$t['setting'].'的数!');
}else{
return array(true,null);
}
}
/*以上是自定义函数和自定义表达式*/
if($_GET['action'] == 'post'){
require('include/Validator.php');
$validate_str = $_POST['valstr'];
unset($_POST['valstr']);
$val = new Validator();
$break = isset($_POST['break'])?true:false;
if($val->validate($_POST,$validate_str,$break)){
echo "提交成功!";
}else{
echo "<h4>提交失败</h4>";
if($break){
echo $val->getMsg();
}else{
echo "<ul>";
foreach($val->getMsg() as $msg){
echo "<li>".$msg."</li>";
}
echo "</ul>";
}
}
}
?>
</div>
<div id="form">
<form action="test.php?action=post" method="post" style="line-height:2;">
标 题 : <input type="text" name="title" value="<?=$_POST['title']?>" /> *<br />
密 码 : <input type="password" name="password" value="<?=$_POST['password']?>" /> *<br />
确认密码 : <input type="password" name="passagain" value="<?=$_POST['passagain']?>" /> *<br />
您的年龄 : <input type="text" name="age" value="<?=$_POST['age']?>" /><br />
您的生日 : <input type="text" name="birth" value="<?=$_POST['birth']?>" /><br />
自定义 : <input type="text" name="a" value="<?=$_POST['a']?>" /><br />
验证字串 : <textarea name="valstr" cols="80" rows="10">title|标题|string|require=请务必填写标题|length(5:30)=标题长度不正确
password|密码|alnumu|require|length(6:)=密码不得少于6位
passagain|确认密码|alnumu|require|equal(password)
age|年龄|int=年龄必须为整数哦!||size(18:100)
birth|生日|time||time_format(Y-m-d)
a|测试类型|testa||testb(10)</textarea><br />
<input name="break" type="checkbox" value="1" /> 只显示单个错误<br />
<input type="submit" value="提交" name="submit" />
</form>
</div>
</body>
</html>
<?php
/**
*
* Created By Baoling
* Date: 2009-07-13
* Contact: .net">baoling@yeah.net / QQ:110042869
* Blog: blog.meiu.cn
*
* 目前支持以下验证类型 注意验证的提示信息中不能含有空格、换行和竖线和等号空格用{SP}代替,换行用{LF}代替,竖线用{VE}
* string 字符,
* time 时间日期,
* alnum 字母加数字,
* alpha 字母,
* alnumu 字母数字下划线,
* digits 数字,
* graph 可显示的字符,
* lower 小写,
* print 可否打印,
* punct 标点,
* whitespace 空格或制表符,
* upper 大写,
* int 整型,
* float 浮点型,
* ipv4 ip地址,
* binary 二进制数,
* domain 域名,
* email Email
*
* 要验证的数组的key | 中文名称 | 验证类型 | 是否必须 | 其他(equal length size format)
* title|标题|string=格式不正确|require=必须要填写|length(22:32)=长度不正确
* age|年龄|int|require|size(1:200) equal(addtime)
* addtime|时间|time|require|time_format(Y-m-d)
* ipaddr|IP地址|ipv4|require|
* email|email地址|email|require|
* password|密码|string|require|equal(title)
* a|测试a|float|require|length(0:199.99)
* b|测试b|binary|require|
* c|测试c|binary||
*
*/
//清除数组内各个值的前后空格
function trimArray($Input){
if (!is_array($Input))
return trim($Input);
return array_map('trimArray', $Input);
}
class Validator{
var $_locale = null;
var $break = false;
var $pass = true;
var $errmsg = array();
var $arr = array();
function validate($arr,$rule_str,$break = null){
if($break !== null){
$this->break = $break;
}
$this->arr = $arr;
if(trim($rule_str) == ''){
exit('Validate rules can't be empty!');
}
$rule_str = str_replace("r",'',trim($rule_str));
$rule_arr = explode("n",$rule_str);
foreach($rule_arr as $rule){
if(!$this->_complier_rule($rule) && $this->break == true){
return false;
}
}
return $this->pass;
}
/**
* 解析每条规则并验证
*/
function _complier_rule($rule){
$rule = trim($rule);
if($rule == ''){
exit('Validate rules can't be empty!');
}else{
$ruleargs = trimArray(explode('|',$rule));
$args = array(
'field' => $ruleargs[0],
'cname' => $ruleargs[1],
'type' => $ruleargs[2],
'require' => $ruleargs[3],
'expression' => $ruleargs[4]
);
unset($ruleargs);
if($this->_validate_require($args)){ //验证字段是否填写
$tpos = strpos($args['type'],'=');
if($tpos){
$func_name = 'validate_'.substr($args['type'],0,$tpos);
$error_title = substr($args['type'],$tpos+1,strlen($args['type']));
}else{
$func_name = 'validate_'.$args['type'];
$error_title = null;
}
if(method_exists($this,$func_name)){
$return = $this->{$func_name}($this->arr[$args['field']],$args,$error_title);
}else{
if(function_exists($func_name)){
list($return,$msg) = call_user_func($func_name,$this->arr[$args['field']],$args);
if(!$return){
if($tpos){
$this->_setMsg($args['field'],null,$error_title);
}else{
$this->_setMsg($args['field'],$args['cname'],$msg);
}
}
}else{
exit('The validator function doesn't exist!');
}
}
if(!$return){
$this->pass = false;
}
//验证表达式
$this->_expressions($args);
}
return $this->pass;
}
}
/**
* 验证必填字段
*/
function _validate_require($args){
if( array_key_exists($args['field'],$this->arr) ){
if(strncasecmp($args['require'],'require',7) == 0 && $this->arr[$args['field']] == ''){
if($mpos = strpos($args['require'],'=')){
$this->_setMsg($args['field'],null,substr($args['require'],$mpos+1,strlen($args['require'])));
}else{
$this->_setMsg($args['field'],$args['cname'],'不能为空!');
}
$this->pass = false;
return false;
}elseif($this->arr[$args['field']] != ''){
return true;
}else{
return false;
}
}elseif(strncasecmp($args['require'],'require',7) == 0){
if($mpos = strpos($args['require'],'=')){
$this->_setMsg($args['field'],null,substr($args['require'],$mpos+1,strlen($args['require'])));
}else{
$this->_setMsg($args['field'],$args['cname'],'不能为空!');
}
$this->pass = false;
return false;
}else{
return false;
}
}
/**
* 验证表达式
*/
function _expressions($args){
if(preg_match_all('/([a-zA-Z0-9_-]+)(([^(]+))=?([^s]*)/',$args['expression'],$t)){
foreach($t[0] as $k=>$v){
if($t[1][$k] != 'time_format'){
$tt = array('expression'=>$t[1][$k],'setting'=>$t[2][$k],'title'=>$t[3][$k]);
$equal_func = "_erun_".$t[1][$k];
if(method_exists($this,$equal_func)){
$this->{$equal_func}($args,$tt);
}else{
if(function_exists($equal_func)){
list($return,$msg) = call_user_func($equal_func,$this->arr[$args['field']],$args,$tt);
}else{
exit('The validator expression function doesn't exist!');
}
if(!$return){
$this->pass = false;
if(!empty($tt['title'])){
$this->_setMsg($args['field'],null,$tt['title']);
}else{
$this->_setMsg($args['field'],$args['cname'],$msg);
}
}
}
}
}
}
}
//表达式equal判断与某个字段是否相等
function _erun_equal($args,$t){
if($this->arr[$args['field']] != $this->arr[$t['setting']]){
$this->pass = false;
if(!empty($t['title'])){
$this->_setMsg($args['field'],null,$t['title']);
}else{
$this->_setMsg($args['field'],$args['cname'],'不一致!');
}
}
}
//表达式length,判断字符长度
function _erun_length($args,$t){
if(strpos($t['setting'], ':') !== false){
$length_rule = explode(':',$t['setting']);
$length = strlen($this->arr[$args['field']]);
if($length_rule[0] == '' && $length > $length_rule[1]){
$this->pass = false;
$title = sprintf("大于 %s 字符的限制!",$length_rule[1]);
}
if($length_rule[1] == '' && $length < $length_rule[0]){
$this->pass = false;
$title = sprintf("不得小于 %s 字符!",$length_rule[0]);
}
if($length_rule[0] != '' && $length_rule[1] != '' && ($length < $length_rule[0] || $length > $length_rule[1])){
$this->pass = false;
$title = sprintf("必须介于 %s 和 %s 字符之间!",$length_rule[0],$length_rule[1]);
}
if(isset($title)){
if(!empty($t['title'])){
$this->_setMsg($args['field'],null,$t['title']);
}else{
$this->_setMsg($args['field'],$args['cname'],$title);
}
}
}
}
//表达式size,验证数字型的大小,支持digits,int和float
function _erun_size($args,$t){
if(strpos($t['setting'], ':') !== false && preg_match('/^(digits|int|float)/i',$args['type'])){
$size_rule = explode(':',$t['setting']);
$num = $this->arr[$args['field']];
if($size_rule[0] == '' && $num > $size_rule[1]){
$this->pass = false;
$title = sprintf("不得大于 %s!",$size_rule[1]);
}
if($size_rule[1] == '' && $num < $size_rule[0]){
$this->pass = false;
$title = sprintf("不得小于 %s!",$size_rule[0]);
}
if($size_rule[0] != '' && $size_rule[1] != '' && ($num < $size_rule[0] || $num > $size_rule[1])){
$this->pass = false;
$title = sprintf("必须在 %s 和 %s 之间!",$size_rule[0],$size_rule[1]);
}
if(isset($title)){
if(!empty($t['title'])){
$this->_setMsg($args['field'],null,$t['title']);
}else{
$this->_setMsg($args['field'],$args['cname'],$title);
}
}
}
}
function getMsg(){
if($this->break){
if(is_array($this->errmsg))
return end($this->errmsg);
}else{
return $this->errmsg;
}
}
function validate_string($value,$args,$typemsg = null){
if(is_string($value)){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'必须是字符!');
}
return false;
}
}
function validate_time($value,$args,$typemsg = null){
$test = @strtotime($value);
if ($test === false || $test === - 1)
{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'不是正确的时间/日期格式!');
}
return false;
}
if(preg_match('/time_format(([^(]+))=?([^s]*)/',$args['expression'],$t)){
if(date($t[1],$test) == $value){
return true;
}else{
if(!empty($t[2])){
$this->_setMsg($args['field'],null,$t[2]);
}else{
$this->_setMsg($args['field'],$args['cname'],'不是正确的时间/日期格式!');
}
return false;
}
}
return true;
}
function validate_alnum($value,$args,$typemsg = null)
{
if(ctype_alnum($value)){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'只能是数字和字母!');
}
return false;
}
}
function validate_alpha($value,$args,$typemsg = null)
{
if(ctype_alpha($value)){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'必须是纯英文字!');
}
return false;
}
}
function validate_alnumu($value,$args,$typemsg = null)
{
if(preg_match('/[^a-zA-Z0-9_]/', $value) == 0){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'只能是字母数字和下划线!');
}
return false;
}
}
function validate_digits($value,$args,$typemsg = null)
{
if(is_numeric($value)){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'必须是数字!');
}
return false;
}
}
function validate_graph($value,$args,$typemsg = null)
{
if(ctype_graph($value)){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'必须是可见字符!');
}
return false;
}
}
function validate_lower($value,$args,$typemsg = null)
{
if(ctype_lower($value)){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'必须全部小写!');
}
return false;
}
}
function validate_print($value,$args,$typemsg = null)
{
if(ctype_print($value)){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'必须是可打印字符!');
}
return false;
}
}
function validate_punct($value,$args,$typemsg = null)
{
if(ctype_punct($value)){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'必须是标点符号!');
}
return false;
}
}
function validate_whitespace($value,$args,$typemsg = null)
{
if(ctype_space($value)){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'必须为空格或制表符!');
}
return false;
}
}
function validate_upper($value,$args,$typemsg = null)
{
if(ctype_upper($value)){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'必须全部大写!');
}
return false;
}
}
function validate_int($value,$args,$typemsg = null)
{
if (is_null($this->_locale))
{
$this->_locale = localeconv();
}
$value = str_replace($this->_locale['decimal_point'], '.', $value);
$value = str_replace($this->_locale['thousands_sep'], '', $value);
if (strval(intval($value)) != $value)
{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'必须为整数!');
}
return false;
}
return true;
}
function validate_float($value,$args,$typemsg = null)
{
if (is_null($this->_locale))
{
$this->_locale = localeconv();
}
$value = str_replace($this->_locale['decimal_point'], '.', $value);
$value = str_replace($this->_locale['thousands_sep'], '', $value);
if (strval(floatval($value)) != $value)
{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'必须为浮点数!');
}
return false;
}
return true;
}
/**
* 是否是 IPv4 地址(格式为 a.b.c.h)
*
* @param mixed $value
*
* @return boolean
*/
function validate_ipv4($value,$args,$typemsg = null)
{
$test = @ip2long($value);
if($test !== - 1 && $test !== false){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'不是有效的IP地址!');
}
return false;
}
}
/**
* 是否是二进制数值
*
* @param mixed $value
*
* @return boolean
*/
function validate_binary($value,$args,$typemsg = null)
{
if(preg_match('/[01]+/', $value)){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'必须是二进制数字!');
}
return false;
}
}
/**
* 是否是 Internet 域名
*
* @param mixed $value
*
* @return boolean
*/
function validate_domain($value,$args,$typemsg = null)
{
if(preg_match('/[a-z0-9.]+/i', $value)){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'不是有效的域名!');
}
return false;
}
}
function validate_email($value,$args,$typemsg = null)
{
if(preg_match('/^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}$/i', $value)){
return true;
}else{
if(isset($typemsg)){
$this->_setMsg($args['field'],null,$typemsg);
}else{
$this->_setMsg($args['field'],$args['cname'],'不是有效的email!');
}
return false;
}
}
function _setMsg($key,$name=null,$text){
if(!isset($this->errmsg[$key])){
if(!isset($name)){
$this->errmsg[$key] = str_replace(array('{SP}','{LF}','{VE}'),array(' ',"n",'|'),$text);
}else{
$this->errmsg[$key] = $name.': '.$text;
}
}
}
}
<?php
$conn=@mysql_connect("localhost","root","123") or die("服务器连接错误!"); //链接数据库
@mysql_select_db("upload",$conn) or die("未发现数据库!");
$query="select * from upfile where ftag=$fn";
$result=mysql_query($query);
if(!$result) die("error: mysql query");
$num=mysql_num_rows($result);
if($num<1) die("error: no this recorder");
$data = mysql_result($result,0,"picture");
header("Content-type: image/JPEG",true);
echo $data;
?>
相关文章
- 轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
- 这篇文章算是超级入门级别的了,我们下面来给各位介绍在photoshop画斜线/直线/虚线的教程了,希望下面这篇文章给你入门来帮助。 PS怎么画斜线 选择铅笔工具,或者画笔...2016-09-14
- 这篇文章主要给大家介绍的是关于Lua语言新手入门的简单教程,文中通过示例代码一步步介绍的非常详细,对各位新手们的入门提供了一个很方便的教程,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。...2020-06-30
- 这篇文章主要为大家分享了20分钟MySQL基础入门教程,快速掌握MySQL基础知识,真正了解MySQL,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-12-02
- 这篇文章主要介绍了C#线程入门教程之单线程介绍,本文讲解了什么是进程、什么是线程、什么是多线程等内容,并给出了一个单线程代码示例,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了react hooks入门详细教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-06
- 这篇文章主要介绍了CocosCreator入门教程之用TS制作第一个游戏,对TypeScript感兴趣的同学,一定要看一下...2021-04-16
- 这篇文章主要介绍了详解Servlet入门级设置(超详细 IDEA2020版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-04
- 这里主要讲到关于在php教程类的调用,申请明,使用以前各种类的实例方法与操作过程,让你清楚的知道php类的construct destruct clone call wake sleep用法。 简单购物车...2016-11-25
- MySQL发展到今天,InnoDB引擎已经作为绝对的主力,除了像大数据量分析等比较特殊领域需求外,它适用于众多场景。然而,仍有不少开发者还在“执迷不悟”的使用MyISAM引擎,觉得对InnoDB无法把握好,还是MyISAM简单省事,还能支持快...2015-11-24
- 这篇文章主要介绍了阿里云ECS服务器入门使用流程(新手必看教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-13
- PHP大小写问题算是一个入门级的教程了,在此小编为php初学者介绍php开发中大小写的一些例子,希望可以帮助到各位。 今天写代码的时候发现自己代码的一处错误: $m_cate...2016-11-25
- 下面举一个很简单的?表达式的实现吧,其实它就是简单的if else哦。 <? $a = 5; //定义变数a=5 $b = 3; //定义变数b=5 $c = ($a==$b) ? ("yes") : ("no"); //如果...2016-11-25
- 现在最热门的前端框架有AngularJS、React、Bootstrap等。自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领略ReactJs的风采吧~~ 文章有点长,耐心读完,你会有很大收获哦...2021-04-05
- 这篇文章主要介绍了C语言入门之基础知识详解,文中有非常详细的C语言使用教程及相关基础知识,对正在学习c语言的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-08-04
- Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,本文给大家分享一个入门案例使用Springboot1.5.9搭建,具体配置部署过程跟随小编一起看看吧...2021-07-12
- 刚在大略浏览了一下首页更新的那篇有关Class的文章(指PHPE的那篇 http://www.phpe.net/articles/389.shtml ),很不错,建议看看。 对类的摸索~~俺用了半年时间才大概理解类的...2016-11-25
- php入门教程:php rtrim()实例教程 定义和用法 该rtrim ( )函数将删除空格或其他预先确定的性质从右侧的一个字符串。 语法 rtrim(string,charlist) 参数说明 字符...2016-11-25
- 这篇文章主要介绍了Java基本数据类型和运算符,结合实例形式详细分析了java基本数据类型、数据类型转换、算术运算符、逻辑运算符等相关原理与操作技巧,需要的朋友可以参考下...2021-08-05
- 这篇文章主要介绍了Golang极简入门教程(一):基本概念,本文讲解了Golang的基本知识、基础语法、相关术语等,需要的朋友可以参考下...2020-05-01