PHP实现随机数字、字母的验证码功能


Posted in PHP onAugust 01, 2018

可自定义生成验证码文字的大小、数量、干扰项等等,也可以自定义验证文字的字体。。。

废话不多说,直接上代码:

1、classgd.class.php

<?php
Class Captcha{
    private $_fontfile='';
    private $_size=36;
    private $_width=200;
    private $_height=100;
    private $_length=4;
    private $_image=null;
    private $_snow=0;
    private $_pixel=0;
    private $_line=0;
  public function __construct($config=array()){
    if(is_array($config)&&count($config)>0){
      if(isset($config['fontfile'])&&is_file($config['fontfile'])&&is_readable($config['fontfile'])){
        $this->_fontfile=$config['fontfile'];
      }else{
        return false;
      }
      if(isset($config['size'])&&$config['size']>0){
        $this->_size=(int)$config['size'];
      }
      if(isset($config['width'])&&$config['width']>0){
        $this->_width=(int)$config['width'];
      }
      if(isset($config['height'])&&$config['height']>0){
        $this->_height=(int)$config['height'];
      }
      if(isset($config['length'])&&$config['length']>0){
        $this->_length=(int)$config['length'];
      }
      if(isset($config['snow'])&&$config['snow']>0){
        $this->_snow=(int)$config['snow'];
      }
      if(isset($config['pixel'])&&$config['pixel']>0){
        $this->_pixel=(int)$config['pixel'];
      }
      if(isset($config['line'])&&$config['line']>0){
        $this->_line=(int)$config['line'];
      }
      $this->_image=imagecreatetruecolor($this->_width,$this->_height);
      return $this->_image;
     }
     else{
      return false;
    }
  }
  public function getCaptcha(){
    $white=imagecolorallocate($this->_image,255,255,255);
    imagefilledrectangle($this->_image,0,0,$this->_width,$this->_height,$white);
    $str=$this->_generateStr($this->_length);
    if(false===$str){
      return false;
    }
    $fontfile=$this->_fontfile;
    for($i=0;$i<$this->_length;$i++){
      $size=$this->_size;
      $angle=mt_rand(-30,30);
      $x=ceil($this->_width/$this->_length)*$i+mt_rand(5,10);
      $y=ceil($this->_height/1.5);
      $color=$this->_getRandColor();
      //针对中文字符截取
      //$text=mb_substr($str,$i,1,'utf-8');
      $text=$str{$i};
      imagettftext($this->_image, $size, $angle, $x, $y, $color, $fontfile, $text);
    }
    if($this->_snow){
      $this->_getSnow();
    }else{
      if($this->_pixel){
        $this->_getPixel();
      }
      if($this->_line){
        $this->_getLine();
      }
    }
    header('content-type:image/png');
    imagepng($this->_image);
    imagedestroy($this->_image);
    return strtolower($str);
  }
  private function _getSnow(){
    for($i=1;$i<=$this->_snow;$i++){
      imagestring($this->_image,mt_rand(1,5),mt_rand(0,$this->_width),mt_rand(0,$this->_height),'*',$this->_getRandColor());
    }
  }
  private function _getPixel(){
    for($i=1;$i<=$this->_pixel;$i++){
      imagesetpixel($this->_image,mt_rand(0,$this->_width),mt_rand(0,$this->_height),$this->_getRandColor());
    }
  }
  private function _getLine(){
    for($i=1;$i<=$this->_line;$i++){
      imageline($this->_image,mt_rand(0,$this->_width),mt_rand(0,$this->_height),mt_rand(0,$this->_width),mt_rand(0,$this->_height),$this->_getRandColor());
    }
  }
  private function _generateStr($length=4){
    if($length<1 || $length>30){
      return false;
    }
    $chars=array(
      'a','b','c','d','e','f','g','h','k','m','n','p','x','y','z',
      'A','B','C','D','E','F','G','H','K','M','N','P','X','Y','Z',
      1,2,3,4,5,6,7,8,9
      );
    $str=join('',array_rand(array_flip($chars),$length));
    return $str;
  }
  private function _getRandColor(){
    return imagecolorallocate($this->_image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
  }
}
?>

 2、testCaptcha.php

<?php
require_once 'classgd.class.php';
$config=array(
'fontfile'=>'fonts/simfang.ttf',  //引入字体文件
//'snow'=>50,
'pixel'=>100,
'line'=>10
  );
$captcha=new Captcha($config);
$captcha->getCaptcha();
?>

总结

以上所述是小编给大家介绍的PHP实现随机数字、字母的验证码功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
php session应用实例 登录验证
Mar 16 PHP
微盾PHP脚本加密专家php解密算法
Sep 13 PHP
基于curl数据采集之单页面采集函数get_html的使用
Apr 28 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
Jun 17 PHP
PHP 通过Socket收发十六进制数据的实现代码
Aug 16 PHP
生成随机字符串和验证码的类的PHP实例
Dec 24 PHP
PHP header()函数常用方法总结
Apr 11 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
Sep 27 PHP
详谈PHP面向对象中常用的关键字和魔术方法
Feb 04 PHP
yii 2.0中表单小部件的使用方法示例
May 23 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
PHP创建对象的六种方式实例总结
Jun 27 PHP
PHP使用XMLWriter读写xml文件操作详解
Jul 31 #PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
Jul 31 #PHP
PHP常用日期加减计算方法实例小结
Jul 31 #PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
Jul 30 #PHP
PHP笛卡尔积实现算法示例
Jul 30 #PHP
作为PHP程序员你要知道的另外一种日志
Jul 30 #PHP
详解Laravel5.6 Passport实现Api接口认证
Jul 27 #PHP
You might like
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
PHP form 表单传参明细研究
2009/07/17 PHP
php利用新浪接口查询ip获取地理位置示例
2014/01/20 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
获取body标签的两种方法
2011/10/13 Javascript
jquery ajax return没有返回值的解决方法
2011/10/20 Javascript
JS控制日期显示的小例子
2013/11/23 Javascript
JavaScript框架(iframe)操作总结
2014/04/16 Javascript
js运动动画的八个知识点
2015/03/12 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
JavaScript电子时钟倒计时
2016/01/09 Javascript
js改变html的原有内容实现方法
2016/10/05 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/06 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
javascript 判断用户有没有操作页面
2017/10/17 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
2017/12/27 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
在vue2.0中引用element-ui组件库的方法
2018/06/21 Javascript
[46:09]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第三场
2014/05/26 DOTA
[42:32]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第二局
2016/02/27 DOTA
Python中类的继承代码实例
2014/10/28 Python
python中日期和时间格式化输出的方法小结
2015/03/19 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
基于python实现学生信息管理系统
2019/11/22 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
python输出数学符号实例
2020/05/11 Python
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
教师个人年终总结
2015/02/11 职场文书
党风廉政建设个人总结
2015/03/06 职场文书
企业法人任命书
2015/09/21 职场文书