php中文验证码
程序员文章站
2022-06-12 16:48:11
...
图形码类文件CnValidataCode.class.php
<?php
class CnValidataCode{
private $str = "飒舐南省林吉昀找月圳日上午培训郴衡永创宇替换潭湖周莹删逊盾除圆编武串肉辑签递北页浏遇殊窗键储函优鞋治健截康封锐虫菜唯返区襄药孙志滨围刘贺判翔享器断栏端割斗曝照参餐骗添荆建罗*酷骑罢龙朱黑锅免类型复杂辉州伟赵白石础帮助详细教程博艳安良百货商场翻译内名度搜岁的女被搅扶梯身据西梧视台报道位多朋友阳世到臂中段基本废置隐掉全事关每生命绝允许万危险什屡发吃故背后都有*监管部门产者保养维护和所失职祸原因民网亲带着孩溲卷目睹这幕如此悲情面估计无数潸然泪下终止竟孤偶让我䃽心于死来说羊补牢经而能庆幸自己没在那敲响实公共警钟底应该何做系乎寥成为话题密问其木起质疑涌出赔偿缺却再也回才是最痛方运行既存就需要意识对拥否已尽了义务确正常转宣传尤进紧急制动样按钮播时候修些之众则件将会头尾答果任层现纰漏至重洞导致剧次以长鸣们注领域液施与另外奏更平论家庭还学校给灌输各种救皋措办演练包含消防等容只够记像吝庥懂得示昌诌提前告知顾客通速及啬服推卸责兆历统谁望看谓定忮改眺轻描淡写追甚负躺顶格惩罚期操汻怂王两天国股暴跌步把市脆弱性熟造陷表淋杜礼漓投资仿贪婪览遗杨见缝插针机想他考虑社利益牛弹琴大势莫锦文章称组织稽查执法力量集抛售票线索核同声明队根退可户恶空分析指变化跑海或谋工具星疾呼过仅街老鼠喊打使证高调处金融交易仓限玉卖单临规透载赚钱减敢地惹火烧未合车约主结算即沪深持增加张但仍例近缩比少恐慌沽象并它移括香港新坡华富当较初份达涉址总价值元宠模吗码年热炒作显著升傍晚点美超亿由且开始聚早嗜血放屠刀立佛晃取衍润几用极灾难况招拆狠宝马奥拓展拳脚击败攻举解预决强获纷逃直崩盘清楚";//验证码所要显示的字符,不要用生僻字和繁体字
private $codelen = 4; //验证码显示字符的长度
private $width=80; //图形验证码的宽度
private $height=30; //图形验证码的高度
private $img; //图形验证码资源对象
private $font; //字体,尽量用宋体,可去网上下载经典中宋简
private $captch_code='';//图形验证码所要显示的字符
private $fontsize=16; //文字大小
private $fontcolor; //文字颜色
public function __construct(){
$this->font='Images/font/SimSum.ttf'; //设置字体路径
}
//生成一个四位的随机码
private function CheckCode(){
$strdb = str_split($this->str,3);
//str_split函数是将字符打散分配到数组,默认是1个字符形成1个数组元素,而汉字占3个字符,因此用3作为一个参数(此参数可有可无,默认为1),即1个汉字形成1个元素
//$strdb数组
for($i=0; $i<$this->codelen; $i++){
$this->fontcolor = imagecolorallocate($this->img, mt_rand(0,120), mt_rand(0,120), mt_rand(0,120)); //随机分配字体颜色
$code = $strdb[mt_rand(0,count($strdb)-1)]; //从数组$strdb 中随机选中1个元素(汉字)
$this->captch_code .= $code;
$_x = $this->width/$this->codelen; //一个汉字所占的宽度
imagettftext($this->img,$this->fontsize,mt_rand(-10,10),$_x*$i,20,$this->fontcolor,$this->font,$code); //将文字渲染到画布(资源句柄)
}
}
//创建一个图形验证码背景
private function createBg(){
$this->img = imagecreatetruecolor($this->width,$this->height); //新建一个真彩色图片赋值给图形验证码资源对象
$color = imagecolorallocate($this->img,255,255,255); //为图形资源对象分配颜色,若失败,则返回-1
//上面的颜色也可以使用随机数,mt_rand(0,255),因本人喜欢简单的,就干脆用了纯白色的背景
imagefilledrectangle($this->img,0,0,$this->width,$this->height,$color); //矩型填充,0,0代表左上角
}
//绘制干扰点和线
private function createLine(){
//干扰点
for($i=0; $i<200; $i++) {
$pointcolor = imagecolorallocate($this->img, rand(50,200), rand(50,200), rand(50,200));
imagesetpixel($this->img, rand(1,$this->width-1), rand(1,$this->width-1), $pointcolor);
}
//干扰线
for($i=0; $i<10; $i++){
$linecolor = imagecolorallocate($this->img, rand(80,220), rand(80,220), rand(80,220));
imageline($this->img, rand(1,$this->width-1), rand(1,$this->width/3-1), rand(1,$this->width-1), rand(1,$this->width/3-1), $linecolor);
}
}
private function doIput(){
ob_clean();
header("Content-Type:image/png");
imagepng($this->img);
imagedestroy($this->img);
}
//获取图形验证码
public function showImg(){
$this->createBg();
$this->CheckCode();
$this->createLine();
$this->doIput();
}
//获取验证码的字符以便得到$_SESSION值
public function getCode(){
return $this->captch_code;
}
}
?>
图形文件code.php
<?php
session_start();
require_once 'CnValidataCode.class.php'; //汉字验证码
$v=new CnValidataCode();
$v->showImg();
$_SESSION['code']=$v->getCode();
?>
表单文件index.html
<input type="text" name="checkcode" required maxlength="4" placeholder="验证码" />
<img src="Code.php" onclick="javascript:this.src='Code.php?v='+Math.random()" />
验证文件check.php
<?php
session_start();
if(trim($_POST['checkcode'])!=$_SESSION['code']) exit('验证码错误');
?>
上一篇: PHP 特殊函数解析