彭勇博客

pengyong'sblog

最权威的身份证号码的正则表达式

作者:彭勇 | 时间:2012-4-26 | | 42 Views
//身份证正则表达式(15位)
isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
//身份证正则表达式(18位)
isIDCard2=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/; 
地区、性别和身份证进行判断的正则表达式:
<script>
var
aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"

安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州"

,53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}

function cidInfo(sId){
var iSum=0
var info=""
if(!/^\d{17}(\d|x)$/i.test(sId))return false;
sId=sId.replace(/x$/i,"a");
if(aCity[parseInt(sId.substr(0,2))]==null)return "Error:非法地区";
sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2));
var d=new Date(sBirthday.replace(/-/g,"/"))
if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "Error:非法生日";
for(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11)
if(iSum%11!=1)return "Error:非法证号";
return aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女")
}


</script>
0

php 漂亮中英文验证码

作者:彭勇 | 时间:2012-4-25 | | 49 Views
<?php   
/**  
 
**/  
class YL_Security_Secoder {   
    //验证码的session的下标  
    public static $seKey = 'verify_py';   //验证码关键字
    public static $expire = 3000;     // 验证码过期时间(s)    
    //验证码中使用的字符,01IO容易混淆,不用  
    //public static $codeSet = '3456789ABCDEFGHJKLMNPQRTUVWXY';   
	public static $codeSet = array('一','二','三','四','五','六','七','八','九');
    public static $fontSize = 26;     // 验证码字体大小(px)   
    public static $useCurve = true;   // 是否画混淆曲线   
    public static $useNoise = true;   // 是否添加杂点    
    public static $imageH = 0;        // 验证码图片宽   
    public static $imageL = 0;        // 验证码图片长   
    public static $length = 4;        // 验证码位数   
    public static $bg = array(200, 255, 255);  // 背景 
    public static $rotateAngle=45;	

    public static $offset=1;	
    public static $padding_left=10;
    protected static $_image = null;     // 验证码图片实例   
    protected static $_color = null;     // 验证码字体颜色   
    
	
	private static $noiseArr=array(3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,V,W,X,Y);
	private static function init()
    {
	   
	  shuffle(self::$codeSet);
	}	
    /**  
     * 输出验证码并把验证码的值保存的session中  
     */  
    public static function entry() {  
        self::init();//初始化	
        // 图片宽(px)   
        self::$imageL || self::$imageL = self::$length * self::$fontSize * 1.5 + self::$fontSize*1.5;    
        // 图片高(px)   
        self::$imageH || self::$imageH = self::$fontSize * 2;   
        // 建立一幅 self::$imageL x self::$imageH 的图像   
        self::$_image = imagecreate(self::$imageL, self::$imageH);    
        // 设置背景         
        imagecolorallocate(self::$_image, self::$bg[0], self::$bg[1], self::$bg[2]);    
        // 验证码字体随机颜色   
        self::$_color = imagecolorallocate(self::$_image, mt_rand(1,120), mt_rand(1,120), mt_rand(1,120));   
        // 验证码使用随机字体,保证目录下有这些字体集   
        //$ttf = dirname(__FILE__) . '/ttfs/t' . mt_rand(1, 1) . '.ttf';     
        $ttf = dirname(__FILE__) . '/ttfs/t9.ttf';  
		//exit($ttf);
        if (self::$useNoise) {   
            // 绘杂点   
            self::_writeNoise();   
        }    
        if (self::$useCurve) {   
            // 绘干扰线   
             self::_writeCurve();   
        }   
           
        // 绘验证码   
        $code = array(); // 验证码   
        $codeNX = 0; // 验证码第N个字符的左边距  
        $tmpSourceArrLen=count(self::$codeSet)-1;
        //echo 	"tmpSourceArrLen=".$tmpSourceArrLen	;
		//exit();
        for ($i = 0; $i<self::$length; $i++) {   
            $code[$i] = self::$codeSet[$i];  
			 //var_dump ($code[$i]);
            //$code[$i]=iconv("GB2312","UTF-8",$code[$i])	;

            //exit();			
           // $codeNX += mt_rand(self::$fontSize*1.2, self::$fontSize*1.2);  
		   
		     //$codeNX  =  $i===0?self::$offset:($i)*(self::$fontSize)-self::$padding_left ; 
			 $codeNX=(self::$fontSize-self::$offset)*$i+self::$padding_left;
         
            imagettftext(self::$_image, self::$fontSize,self::$rotateAngle, $codeNX, self::$fontSize*1.5, self::$_color, $ttf, $code[$i]);   
        }
 	
           
        // 保存验证码   
        isset($_SESSION) || session_start();   
        $_SESSION[self::$seKey]['code'] = join('', $code); // 把验证码保存到session, 验证时注意是大写  
        $_SESSION[self::$seKey]['time'] = time();  // 验证码创建时间   
                       
        header('Pragma: no-cache');        
        header("content-type: image/JPEG");   
       
        // 输出图像   
        imageJPEG(self::$_image);    
        imagedestroy(self::$_image);   
    }   
       
    /**   
     * 画一条由两条连在一起构成的随机正弦函数曲线作干扰线(你可以改成更帅的曲线函数)   
     *      正弦型函数解析式:y=Asin(ωx+φ)+b  
     *      各常数值对函数图像的影响:  
     *        A:决定峰值(即纵向拉伸压缩的倍数)  
     *        b:表示波形在Y轴的位置关系或纵向移动距离(上加下减)  
     *        φ:决定波形与X轴位置关系或横向移动距离(左加右减)  
     *        ω:决定周期(最小正周期T=2π/∣ω∣)  
     */  
    protected static function _writeCurve() {   
        $A = mt_rand(1, self::$imageH/2);                  // 振幅   
        $b = mt_rand(-self::$imageH/4, self::$imageH/4);   // Y轴方向偏移量   
        $f = mt_rand(-self::$imageH/4, self::$imageH/4);   // X轴方向偏移量   
        $T = mt_rand(self::$imageH*1.5, self::$imageL*2);  // 周期   
        $w = (2* M_PI)/$T;   
                           
        $px1 = 0;  // 曲线横坐标起始位置   
        $px2 = mt_rand(self::$imageL/2, self::$imageL * 0.667);  // 曲线横坐标结束位置              
        for ($px=$px1; $px<=$px2; $px=$px+ 0.9) {   
            if ($w!=0) {   
                $py = $A * sin($w*$px + $f)+ $b + self::$imageH/2;  // y = Asin(ωx+φ) + b   
                $i = (int) ((self::$fontSize - 6)/4);   
                while ($i > 0) {    
                    imagesetpixel(self::$_image, $px + $i, $py + $i, self::$_color);  
					//这里画像素点比imagettftext和imagestring性能要好很多                     
                    $i--;   
                }   
            }   
        }   
           
        $A = mt_rand(1, self::$imageH/2);                  // 振幅           
        $f = mt_rand(-self::$imageH/4, self::$imageH/4);   // X轴方向偏移量   
        $T = mt_rand(self::$imageH*1.5, self::$imageL*2);  // 周期   
        $w = (2* M_PI)/$T;         
        $b = $py - $A * sin($w*$px + $f) - self::$imageH/2;   
        $px1 = $px2;   
        $px2 = self::$imageL;   
        for ($px=$px1; $px<=$px2; $px=$px+ 0.9) {   
            if ($w!=0) {   
                $py = $A * sin($w*$px + $f)+ $b + self::$imageH/2;  // y = Asin(ωx+φ) + b   
                $i = (int) ((self::$fontSize - 8)/4);   
                while ($i > 0) {            
                    imagesetpixel(self::$_image, $px + $i, $py + $i, self::$_color); 
					//这里(while)循环画像素点比imagettftext和imagestring用字体大小一次画出
					//的(不用while循环)性能要好很多       
                    $i--;   
                }   
            }   
        }   
    }   
       
    /**  
     * 画杂点  
     * 往图片上写不同颜色的字母或数字  
     */  
    protected static function _writeNoise() {   
        for($i = 0; $i < 10; $i++){   
            //杂点颜色   
            $noiseColor = imagecolorallocate(   
                              self::$_image,    
                              mt_rand(120,225),    
                              mt_rand(120,225),    
                              mt_rand(120,225)   
                          );   
            for($j = 0; $j < 5; $j++) {   
                // 绘杂点   
                imagestring(   
                    self::$_image,   
                    5,    
                    mt_rand(-10, self::$imageL),    
                    mt_rand(-10, self::$imageH),    
                    self::$noiseArr[mt_rand(0, 28)], // 杂点文本为随机的字母或数字   
                    $noiseColor  
                );   
            }   
        }   
    }

    /**
	 * 验证验证码是否正确
	 *
	 * @param string $code 用户验证码
	 * @param bool 用户验证码是否正确
	 */
	public static function check($code) {
		isset($_SESSION) || session_start();
		// 验证码不能为空
		if(empty($code) || empty($_SESSION[self::$seKey])) {
			return false;
		}
		// session 过期
		if(time() - $_SESSION[self::$seKey]['time'] > self::$expire) {
			unset($_SESSION[self::$seKey]);
			return false;
		}
        if(strcasecmp($_SESSION[self::$seKey]['code'], trim($_POST['checkcode']))==0)
		{
			return true;
		}

		return false;
	}	
}   
  



?>


index.php

<?php   
mb_internal_encoding("utf-8");
include  "verify.class.php";
 //调用上面定义的验证码类 来生产验证码
YL_Security_Secoder::$fontSize=18;
YL_Security_Secoder::$imageL=100;
YL_Security_Secoder::$imageH=30;

$is_cn=true || false;//中文还是英文
if($is_cn)
{
	//中文
	$chineseDictStr="从明天起做一个幸福的人喂马劈柴周游世界从明天起关心粮食和蔬菜我有一所房子面朝大海春暖花开从明天起和每一个亲人通信告诉他们我的幸福那幸福的闪电告诉我的我将告诉每一个人给每一条河每一座山取一个温暖的名字陌生人我也为你祝福愿你有一个灿烂的前程愿你有情人终成眷属愿你在尘世获得幸福我只愿面朝大海春暖花开";
	$chineseArr=mb_str_split( $chineseDictStr ); //得到字符串
	//如果不考虑重复,下面三条可以注释,
	$chineseArr=array_unique($chineseArr);//去重复
	$chineseArr=array_values($chineseArr);//重新索引
	$chineseArr=getUniqueItem($chineseArr,YL_Security_Secoder::$length);//获取指定长度不重复字符串
	YL_Security_Secoder::$codeSet=$chineseArr;//
}
else
{
	 //英文
	YL_Security_Secoder::$codeSet=mb_str_split('3456789ABCDEFGHJKLMNPQRTUVWXY');
	YL_Security_Secoder::$offset=8;
	YL_Security_Secoder::$imageL=60;
	
}


YL_Security_Secoder::$rotateAngle=mt_rand(-10, 20);
//$randBgR=mt_rand(0,243);
//YL_Security_Secoder::$bg=array($randBgR, 251, 254);  // 背景 
YL_Security_Secoder::$useNoise = true;  //是否启用噪点  
YL_Security_Secoder::$useCurve = false;   //是否启用干扰曲线
YL_Security_Secoder::entry(); 
 
function mb_str_split( $string ) { 
    # Split at all position not after the start: ^ 
    # and not before the end: $ 
    return preg_split('/(?<!^)(?!$)/u', $string ); 
} 



// $string   = '火车票'; 
// $charlist = mb_str_split( $string ); 

function getUniqueItem($array,$len)
{
  if(! is_array($array)|| (count($array)<1) || ($len <1))
  {
      return  array();
  } 
  
  $tmpArr=array();
  $arrLen=count($array);
  for($i=0;$i<$len;$i++)
  {
   $randNum=mt_rand(0,$arrLen-1);
   $tmpArr[]=$array[$randNum];
   $array[$randNum]=$array[$arrLen-1];
   array_pop($array);
   $arrLen--;
  }
   return $tmpArr;
}

?>

 

演示地址:demo

0

漂亮的PHP验证码类

作者:彭勇 | 时间:2012-4-25 | | 57 Views
<?php
	//验证码类
 	class ValidateCode {
		private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789'; //随机因子
  		private $code;       //验证码
  		private $codelen = 4;     //验证码长度
  		private $width = 130;     //宽度
  		private $height = 50;     //高度
  		private $img;        //图形资源句柄
  		private $font;        //指定的字体
  		private $fontsize = 20;    //指定字体大小
  		private $fontcolor;      //指定字体颜色
  
  		//构造方法初始化
  		public function __construct() {
   			$this->font = ROOT_PATH.'/font/elephant.ttf';
  		}
  
 		 //生成随机码
  		private function createCode() {
   			$_len = strlen($this->charset)-1;
   			for ($i=0;$i<$this->codelen;$i++) {
    				$this->code .= $this->charset[mt_rand(0,$_len)];
   			}
  		}
  
  		//生成背景
  		private function createBg() {
   			$this->img = imagecreatetruecolor($this->width, $this->height);
   			$color = imagecolorallocate($this->img, mt_rand(157,255), mt_rand(157,255), mt_rand(157,255));
   			imagefilledrectangle($this->img,0,$this->height,$this->width,0,$color);
  		}
  
  		//生成文字
  		private function createFont() { 
   			$_x = $this->width / $this->codelen;
   			for ($i=0;$i<$this->codelen;$i++) {
    				$this->fontcolor = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
    				imagettftext($this->img,$this->fontsize,mt_rand(-30,30),$_x*$i+mt_rand(1,5),$this->height / 1.4,$this->fontcolor,$this->font,$this->code[$i]);
   			}
  		}
  
  		//生成线条、雪花
  		private function createLine() {
   			for ($i=0;$i<6;$i++) {
    				$color = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
    				imageline($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color);
   			}
   			for ($i=0;$i<100;$i++) {
    				$color = imagecolorallocate($this->img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
    				imagestring($this->img,mt_rand(1,5),mt_rand(0,$this->width),mt_rand(0,$this->height),'*',$color);
   			}
  		}
  
  		//输出
  		private function outPut() {
   			header('Content-type:image/png');
   			imagepng($this->img);
   			imagedestroy($this->img);
  		}
  
  		//对外生成
  		public function doimg() {
   			$this->createBg();
   			$this->createCode();
   			$this->createLine();
   			$this->createFont();
  	 		$this->outPut();
  		}
  
  		//获取验证码
  		public function getCode() {
   			return strtolower($this->code);
  		}
  
 }
 
?>

阅读全文>>

0

Notepad++正则表达式

作者:彭勇 | 时间:2012-4-23 | 工作 | 52 Views
使用正则表达式可以很好地完成很多繁琐耗时的工作,以下抄录editplus正则表达式的使用,同样适用于notepad++:
表达式 说明
\t 制表符.
\n 新行.
. 匹配任意字符.
| 匹配表达式左边和右边的字符. 例如, "ab|bc" 匹配 "ab" 或者 "bc".
[] 匹配列表之中的任何单个字符. 例如, "[ab]" 匹配 "a" 或者 "b". "[0-9]" 匹配任意数字.
[^] 匹配列表之外的任何单个字符. 例如, "[^ab]" 匹配 "a" 和 "b" 以外的字符. "[^0-9]" 匹配任意非数字字符.
* 其左边的字符被匹配任意次(0次,或者多次). 例如 "be*" 匹配 "b", "be" 或者 "bee".
+ 其左边的字符被匹配至少一次(1次,或者多次). 例如 "be+" 匹配 "be" 或者 "bee" 但是不匹配 "b".
? 其左边的字符被匹配0次或者1次. 例如 "be?" 匹配 "b" 或者 "be" 但是不匹配 "bee".
^ 其右边的表达式被匹配在一行的开始. 例如 "^A" 仅仅匹配以 "A" 开头的行.
$ 其左边的表达式被匹配在一行的结尾. 例如 "e$" 仅仅匹配以 "e" 结尾的行.
() 影响表达式匹配的顺序,并且用作表达式的分组标记.
\ 转义字符. 如果你要使用 "\" 本身, 则应该使用 "\\".

阅读全文>>

0

header中的Cache-control参数说明

作者:彭勇 | 时间:2012-4-11 | 杂七杂八 | 72 Views
网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。其作用根据不同的重新浏览方式分为以下几种情况:

(1) 打开新窗口
    值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值,那么在此值内的时间里就不会重新访问服务器,例如:Cache-control: max-age=5(表示当访问此网页后的5秒内再次访问不会去服务器)
(2) 在地址栏回车
   值为private或must-revalidate则只有第一次访问时会访问服务器,以后就不再访问。值为no-cache,那么每次都会访问。值为max-age,则在过期之前不会重复访问。
(3) 按后退按扭
  值为private、must-revalidate、max-age,则不会重访问,值为no-cache,则每次都重复访问
(4) 按刷新按扭
  无论为何值,都会重复访问
Cache-control值为“no-cache”时,访问此页面不会在Internet临时文章夹留下页面备份。
另外,通过指定“Expires”值也会影响到缓存。例如,指定Expires值为一个早已过去的时间,那么访问此网时若重复在地址栏按回车,那么每次都会重复访问: Expires: Fri, 31 Dec 1999 16:00:00 GMT
比如:禁止页面在IE中缓存

阅读全文>>

0

dede采集过滤全收罗|织梦{dede:trim}

作者:彭勇 | 时间:2012-4-6 | dedecms | 57 Views

dede采集过程中最麻烦的莫过于采集的正则过滤函数的编写。说实在的,dede在这点上和很多ASP CMS系统比如说动易等,采集的时候直接选择几个选项就可以了,简单的完成想过滤的东西。不过他们只局限于对文章内容的过滤不是很好。而DEDE却能对所有采集的字段进行过滤,功能上弥补了易用性的缺陷,期待柏拉图在后续版本中加上选择性过滤功能。
下面是在综合论坛上网友的各种正则的一个全集:

以下是常用过滤:
{dede:trim} {/dede:trim}   // 过滤空格
{dede:trim}<a([^>]*)>([^<]*)</a>{/dede:trim}
{dede:trim}<script([^>]*)>([^>]*)</script>{/dede:trim}
{dede:trim}<div([^>]*)>([^<]*)</div>{/dede:trim}
{dede:trim}<IFRAME([^>]*)>([^>]*)</IFRAME>{/dede:trim}
{dede:trim}<object([^>]*)>([^>]*)</object>{/dede:trim}

阅读全文>>

0

php获取当前脚本完整地址

作者:彭勇 | 时间:2012-3-29 | php | 78 Views
function curPageURL() 
{
    $pageURL = 'http';
 if(isset($_SERVER["HTTPS"]))
 {
  if ($_SERVER["HTTPS"] == "on") 
  {
   $pageURL .= "s";
  }
 }
    
    $pageURL .= "://";

    if ($_SERVER["SERVER_PORT"] != "80") 
    {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } 
    else 
    {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}

阅读全文>>

0

织梦函数==获得当前的脚本网址

作者:彭勇 | 时间:2012-3-29 | php | 65 Views
//获得当前的脚本网址
    function GetCurUrl()
    {
        if(!empty($_SERVER["REQUEST_URI"]))
        {
            $scriptName = $_SERVER["REQUEST_URI"];
            $nowurl = $scriptName;
        }
        else
        {
            $scriptName = $_SERVER["PHP_SELF"];
            if(empty($_SERVER["QUERY_STRING"])) {
                $nowurl = $scriptName;
            }
            else {
                $nowurl = $scriptName."?".$_SERVER["QUERY_STRING"];
            }
        }
        return $nowurl;
    }

阅读全文>>

0

PHP导出excel

作者:彭勇 | 时间:2012-3-27 | php | 99 Views

<?php
$filename="info.xls";//先定义一个excel文件

header("Content-Type: application/vnd.ms-execl");
header("Content-Type: application/vnd.ms-excel; charset=utf-8");
header("Content-Disposition: attachment; filename=$filename");
header("Pragma: no-cache");
header("Expires: 0");

//我们先在excel输出表头,当然这不是必须的
echo iconv("utf-8", "gb2312", "编号")."\t";
echo iconv("utf-8", "gb2312", "姓名")."\t";
echo iconv("utf-8", "gb2312", "年龄")."\t";
echo iconv("utf-8", "gb2312", "性别")."\n";//注意这个要换行

阅读全文>>

0

jQuery日期选择插件 glDatePicker 使用方法

作者:彭勇 | 时间:2012-3-25 | javascript | 148 Views

glDatePicker是一个简单,可以定义,轻量级jQuery日期选择插件。压缩后只有4KB左右。它提供的一些功能包括:向前和向后导航,默认当天日期高亮选中,显示当前选中的日期,限制日期选择范围(如:将日期限制在开始日期后的N天内),设置每一个日期选择器的样式。

Example styles 

阅读全文>>

0