php 图形验证码类

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

php 图形验证码类
<img src="verify_image.php" alt="点此刷新验证码" name="verify_code" width="65" height="20" border="0" id="verify_code" onclick="document.getElementById('verify_code').src='verify_image.php?'+Math.random();" style="cursor:pointer;" />


复制代码字体文件见附件!

<?php

session_start();

 

$vi = new vCodeImage;

$vi->SetImage(1,4,65,20,80,1);

 

class vCodeImage{

 /*******************************************************

 **FILENAME: verify_image.php

 **COPYRIGHT: NONE! (但请保留此信息)

 **AUTHOR: vsFree.Com

 **DATE: 2007-08-08

 ********************************************************/

 

 var $mode;  //1:数字模式,2:字母模式,3:数字字母模式,其他:数字字母优化模式

 var $v_num;  //验证码个数

 var $img_w;  //验证码图像宽度

 var $img_h;  //验证码图像高度

 var $int_pixel_num;  //干扰像素个数

 var $int_line_num;  //干扰线条数

 var $font_dir;   //字体文件相对路径

 var $border;   //图像边框

 var $borderColor;  //图像边框颜色

 

 function SetImage($made,$v_num,$img_w,$img_h,$int_pixel_num,$int_line_num,$font_dir='../font',$border=true,$borderColor='255,200,85'){

  if(!isset($_SESSION['vCode'])){

   session_register('vCode');

  }

  $_SESSION['vCode']="";

 

  $this->mode = $made;

  $this->v_num = $v_num;

  $this->img_w = $img_w;

  $this->img_h = $img_h;

  $this->int_pixel_num = $int_pixel_num;

  $this->int_line_num = $int_line_num;

  $this->font_dir = $font_dir;

  $this->border = $border;

  $this->borderColor = $borderColor;

  $this->GenerateImage();

 }

 

 function GetChar($mode){

  if($mode == "1"){

   $ychar = "0,1,2,3,4,5,6,7,8,9";

  }

  else if($mode == "2"){

   $ychar = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";

  }

  else if($mode == "3"){

   $ychar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";

  }

  else

   $ychar = "3,4,5,6,7,8,9,A,B,C,D,H,K,P,R,S,T,W,X,Y";

  return $ychar;

 }

 

 function RandColor($rs,$re,$gs,$ge,$bs,$be){

  $r = mt_rand($rs,$re);

  $g = mt_rand($gs,$ge);

  $b = mt_rand($bs,$be);

  return array($r,$g,$b);

 }

 

 function GenerateImage(){

  $im = imagecreate($this->img_w,$this->img_h);

 

  $black = imagecolorallocate($im, 0,0,0);

  $white = imagecolorallocate($im, 255,255,255);

  $bgcolor = imagecolorallocate($im, 250,250,250);

 

  imagefill($im,0,0,$bgcolor);

 

  $fonts = ScanDir($this->font_dir);

  $fmax = count($fonts) - 2;

 

  $ychar = $this->GetChar($this->mode);

  $list = explode(",",$ychar);

 

  $x = mt_rand(2,$this->img_w/($this->v_num+2));

  $cmax = count($list) - 1;

 

  $v_code = '';

 

  for($i=0;$i<$this->v_num;$i++) //验证码

  {

   $randnum = mt_rand(0,$cmax);

   $this_char = $list[$randnum];

   $v_code .= $this_char;

   $size = mt_rand(intval($this->img_w/5),intval($this->img_w/4));

   $angle = mt_rand(-20,20);

   $y = mt_rand(($size+2),($this->img_h-2));

   if($this->border)

    $y = mt_rand(($size+3),($this->img_h-3));

   $rand_color = $this->RandColor(0,200,0,100,0,250);

   $randcolor = imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);

   $fontrand = mt_rand(2, $fmax);

   $font = "$this->font_dir/".$fonts[$fontrand];

   imagettftext($im, $size, $angle, $x, $y, $randcolor, $font, $this_char);

   $x = $x + intval($this->img_w/($this->v_num+1));

  }

 

  for($i=0;$i<$this->int_pixel_num;$i++){//干扰像素

   $rand_color = $this->RandColor(50,250,0,250,50,250);

   $rand_color_pixel = imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);

   imagesetpixel($im, mt_rand()%$this->img_w, mt_rand()%$this->img_h, $rand_color_pixel);

  }

 

  for($i=0;$i<$this->int_line_num;$i++){ //干扰线

   $rand_color = $this->RandColor(0,250,0,250,0,250);

   $rand_color_line = imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);

   imageline($im, mt_rand(0,intval($this->img_w/3)), mt_rand(0,$this->img_h), mt_rand(intval($this->img_w - ($this->img_w/3)),$this->img_w), mt_rand(0,$this->img_h), $rand_color_line);

  }

 

  if($this->border) //画出边框

  {

   if(preg_match("/^d{1,3},d{1,3},d{1,3}$/",$this->borderColor)){

    $borderColor = explode(',',$this->borderColor);

   }

   $border_color_line = imagecolorallocate($im,$borderColor[0],$borderColor[1],$borderColor[2]);

   imageline($im, 0, 0, $this->img_w, 0, $border_color_line); //上横

   imageline($im, 0, 0, 0, $this->img_h, $border_color_line); //左竖

   imageline($im, 0, $this->img_h-1, $this->img_w, $this->img_h-1, $border_color_line); //下横

   imageline($im, $this->img_w-1, 0, $this->img_w-1, $this->img_h, $border_color_line); //右竖

  }

 

  imageantialias($im,true); //抗锯齿

 

  $time = time();

  $_SESSION['vCode'] = $v_code."|".$time; //把验证码和生成时间负值给$_SESSION[vCode]

 

  //生成图像给浏览器

  if (function_exists("imagegif")) {

      header ("Content-type: image/gif");

      imagegif($im);

  }

  elseif (function_exists("imagepng")) {

      header ("Content-type: image/png");

      imagepng($im);

  }

  elseif (function_exists("imagejpeg")) {

      header ("Content-type: image/jpeg");

      imagejpeg($im, "", 80);

  }

  elseif (function_exists("imagewbmp")) {

      header ("Content-type: image/vnd.wap.wbmp");

      imagewbmp($im);

  }

  else

      die("No Image Support On This Server !");

 

  imagedestroy($im);

 }

}

 

$_SERVER[’PHP_SELF’]在开发的时候常会用到,一般用来引用当前网页地址,并且它是系统自动生成的全局变量,也会有什么问题么?让我们先看看下面的代码吧:

<form action=”<?php echo $_SERVER[’PHP_SELF’]; ?>”>
<input type=”submit” name=”submit” value=”submit” />
</form>
这段代码非常简单,我们想用$_SERVER[’PHP_SELF’]来让网页提交时提交到它自己,假设代码文件名为test.php,在执行的时候就一定会得到我们期望的地址么?首先试试地址http://…/test.php,结果当然是没有问题的啦,别着急,你再访问一下http://…/test.php/a=1,将会得到如下客户端代码:

<form action=”/fwolf/temp/test.php/a=1″>
<input type=”submit” name=”submit” value=”submit” />
</form>
显然,这已经超出了我们的期望,web服务器居然没有产生诸如404之类的错误,页面正常执行了,并且在生成的html代码中居然有用户可以输入的部分,恐怖的地方就在这里。别小看那个“a=1”,如果把它换成一段js代码,就显得更危险了,比如这么调用:

http://…/test.php/%22%3E%3Cscript%3Ealert(’xss’)%3C/script%3E%3Cfoo
是不是看到了js的alert函数执行的效果?检查一下生成的html源代码找找原因吧。

通过这种嵌入js代码的方式,攻击者能

php 表单敏感字符过滤代码
/**
* 表单生成验证文件
*/
$_form = new formHtmlFind();
class formHtmlFind{
        /**
         * 输出表单函数
         * $formKey  表单键
         * $infoArray 更新时的原始信息数组
         */

        public function formHtml($array,$infoArray='')
        {
                // 检测数组是否存在
                if(empty($array))return false;
                $newform = null;
                // 信息数组(更新信息)
                $this->infoArray = !empty($infoArray)?$infoArray:array();
                $this->array['class'] =  get_class_methods(get_class());
                foreach ($array as $key =>$arr)
                {
                        // 键值转换为纯英文
                        $key = preg_replace("/[^a-z]/i",'',$key);
                        // 生成表单
                        $newform .= $this->outputForm($arr,$key);
                }
                // 输出表单
                return $newform.$this->jsError();
        }
        /**
         * 生成表单函数
         */
        private function outputForm($arr,$key)
        {
                $value = null;
                if(empty($arr))return false;
                // input Type
                $type   = $key;
                // input NAME
                $name   = trim($arr[0]);
                // input 初始值 不包含多选,单选类
                $value  = (!empty($this->infoArray[$name]))? trim($this->infoArray[$name]):trim($arr[1]);
                $value  = empty($this->post[$name])? $value :trim($this->post[$name]);
                // input Title
                $title  = trim($arr[2]);
                // 样式
                $style  = trim($arr[3]);
                if($key!=="hidden")
                {
                        $dt = "<dt>{$title}</dt><dd>";
                        // js错误提示
                        $dd = "<tt id="J{$name}"></tt></dd>rn";
                }
                return (!preg_match("/checkbox|select|radio/i",$key))?
                $dt.$this->newInput($type,$name,$value,$style,$title).$dd:
                $this->formSelect($type,$name,$arr[1],$title,$style); // 多选类
        }
        /**
         * 提交数据检测
         */
        public function postForm($array)
        {
                // 检测数组是否存在
                if(empty($array)||empty($_POST))return false;
                $this->post           =  $_POST;
                $this->array['class'] =  get_class_methods(get_class());
                foreach ($array as $key =>$arr)
                {
                        // 键值转换为纯英文
                        $key = preg_replace("/[^a-z]/i",'',$key);
                        // 检测 注销file类表单
                        if (!empty($arr)&&'file' != $key)$newData[trim($arr[0])] = $this->postFind($arr,$key);
                }
                // 输出表单
                if(!empty($this->error))
                {
                        return false;
                }
                else return $newData;
        }
        /**
         * 生成表单
         */
        private function newInput($type,$name,$value,$style,$title)
        {
                switch ($type)
                {
                        case 'text':
                                // 单行文本
                                return  "<input type="text" name="{$name}" value="{$value}" {$style}/>";
                                break;
                        case 'password':
                                //密码输入
                                return "<input type="password" name="{$name}" {$style}/>";
                                break;
                        case '':
                                //多行文本
                                return "<textarea name="{$name}" {$style}/>{$value}</textarea>";
                                break;
                        case 'hidden':
                                // 隐藏
                                return "<input type="hidden" name="{$name}" value="{$value}" {$style}/>";
                                break;
                        case 'file':
                                // 文件上传
                                return "<input type= "file"name="{$name}" {$style}/>";
                                break;
                        case 'submit':
                                // 提交
                                return "<input type="submit" name="{$name}" value="$value" $style}/>";
                                break;
                        default:
                                return "{$type}类型错误!!!";
                                break;
                }
        }
        /**
         * 提交信息检测
         * 错误返回error
         */
        private function postFind($arr,$key)
        {
                if(empty($arr))return false;
                $name = $title =$error =$find =$standard =null;
                // input NAME
                $name     = trim($arr[0]);
                // input Title
                $title    = trim($arr[2]);
                // 错误提示
                $error    = trim($arr[4]);
                // 检测类型 Y N
                $find     = trim($arr[5]);
                // 检测标准
                $standard = trim($arr[6]);
                //
                if(!empty($standard))$this->error .=$this->ck_split($standard,$name,$title,$find,$error);
                // 转换为字符串
                if(is_array($this->post[$name]))$this->post[$name] = implode(",",$this->post[$name]);
                // 转义或其他转化
                $KKarray = array();
                if(preg_match("/Y|N/is",$find))
                {
                        $KKarray       = split("_", $find);
                        // 转义或过滤
                        $escape_filter = (!empty($KKarray[1]))?'ck_'.$KKarray[1]:'';
                        // 输出通过检测的合法数据
                        $data          = ($escape_filter)?$this->$escape_filter($this->post[$name]):$this->post[$name];

                }
                else  $data        = "";
                // 输出新的数据
                return $data;
        }
        /**
         * 多选类表单生成
         */
        private function formSelect($type,$name,$value,$title,$style)
        {
                $outform = null;
                // 触发更新和提交动作时的初始
                $nowvalue = (!empty($this->post[$name]))?$this->post[$name]:$this->infoarray[$name];
                // 兼容多选的识别,转为数组
                if(!empty($nowvalue))$valueArray = explode(",",$nowvalue);
                // 选项标题
                if(is_array($title))
                {
                        array_unshift($title,'选择');
                        $titarray = array_values($title);
                }else $titarray = explode("|",$title);
                // 选项值
                if(is_array($value))
                {
                        array_unshift($value,'选择');
                        $valarray  = array_keys($value);
                        if(empty($title))$titarray = array_values($value);
                }
                else $valarray = explode("|",$value);
                // 取消表单的初始默认值
                if(!empty($this->post)&&!empty($this->infoArray))$value = preg_replace("/Y_/i",'',$value);

                foreach ($valarray as $key =>$varl)
                {
                        // 非默认的识别
                        if(!empty($valueArray))$select   = (in_array($varl,$valueArray))?'Y':'';
                        //  判断是否为默认
                        else $select   = (eregi("Y_",$varl))? 'Y':'';

                        if($key >'0')
                        {
                                $_title=($titarray[$key])? $titarray[$key]:$title;
                                switch ($type)
                                {
                                        case 'select':
                                                if('Y' == $select)$select = 'selected';
                                                $outform .=        sprintf("<option %s value="%s"/>%s</option>rn"
                                                ,$select,preg_replace("/Y_/i",'',$varl),$_title);
                                                break;
                                        case 'radio':
                                                if('Y' == $select)$select = 'checked';
                                                $outform .= sprintf("<label>%s<input %s type="radio" name="%s" value="%s" %s/></label>rn",
                                                $_title,$select,$name,$varl,$style);
                                                break;
                                        case 'checkbox':
                                                if('Y' == $select)$select = 'checked';
                                                $outform .= sprintf("<label>%s<input %s type="checkbox" name="%s[]" value="%s" %s/></label>rn",$_title,$select,$name,$varl,$style);
                                                break;
                                }
                                $select =null;
                        }
                }
                // 下拉选择
                if($type =='select')$outform = sprintf('<select name="%s" %s>%s</select>',$name,$style,$outform);
                return sprintf("<dt>%s</dt><dd>%s<tt id="J%s"></tt></dd>rn",$titarray[0],$outform,$name);
        }
        /**
         * 表单验证 及全部 ck_类函数
         */
        private function ck_split($standard,$name,$title,$find,$error)
        {
                //  非必填缺省跳过
                if(eregi('N',$find) && empty($this->post[$name]))return false;
                // 必填缺省检测
                if(eregi('Y',$find) && empty($this->post[$name]))return "["J{$name}","$error"],";
                $t_error = null;
                // 多项检测
                $arr = explode(',',$standard);
                // POST数据检测
                if(!empty($arr))foreach ($arr as $var)
                {
                        if(trim($var)!='')
                        {
                                switch ($this->post)
                                {
                                        case is_array($this->post[$name]):
                                                // 数组类的检测
                                                foreach ($this->post[$name] as $_var)
                                                {
                                                        $t_error.= ($this->ck_open($_var,trim($var)))?"":$error;
                                                        if($t_error)break;
                                                }
                                                break;
                                        default:
                                                $t_error.= ($this->ck_open($this->post[$name],trim($var)))?"":$error;
                                                break;
                                }
                                if($t_error)break;
                        }
                }
                return ($t_error)? "["J{$name}","$t_error"],":"";
        }
        // 函数调用
        private function ck_open($string,$str)
        {
                $functi = $this->ck_detected($str);
                return ($this->$functi($string,$str))? true:false;
        }
        // 类型判断
        private function ck_detected($str)
        {
                $detect = (eregi("^[a-zA-Z]*$",$str))? "{$str}Detect":'lengthDetect';
                if(!in_array($detect,$this->array['class']))
                {
                        location('index.php',$ck,' Lack of function !!!');
                }
                return $detect;
        }
        //-------------------------------------以下为检测函数可外部调用
        // 长度
        public function lengthDetect($string,$str){
                $len = split('-',trim($str));
                return (strlen($string) > ($len[0]-1) && strlen($string) < ($len[1]+1))? true:false;
        }
        // 价格
        public function moneyDetect($str){
                return preg_match("/^(-|+)?d+(.d+)?$/",$str);
        }
        // 邮件
        public function emailDetect($str){
                return preg_match("/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/", $str);
        }
        // 网址
        public function urlDetect($str){
                return preg_match("/^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]':+!]*([^<>"])*$/", $str);
        }
        // 数字型
        public function numDetect($str){
                return is_numeric($str);
        }
        // 中文
        public function cnDetect($str){
                return preg_match("/^[x7f-xff]+$/", $str);
        }
        // 字母
        public function enDetect($str){
                return preg_match("/^[A-Za-z]+$/", $str);
        }
        // 数字字母混合
        public function numenDetect($str){
                return preg_match("/^([a-zA-Z0-9_-])+$/",$str);
        }
        // 电话号码
        public function telDetect($str){
                return ereg("^[+]?[0-9]+([xX-][0-9]+)*$", $str);
        }
        // 敏感词
        public function keyDetect($str){
                return (!preg_match("/$badkey/i",$str));
        }
        //-----------------------------------------------------输出
        // 字符替换
        public function ck_filter($str){
                $str=(is_array($str))? implode(",",$str):$str;
                $str=nl2br($str); //将回车替换为<br>
                $str=htmlspecialchars($str); //将特殊字元转成 HTML 格式。
                //$str=str_replace(array(" ",'<? '),array(" ",'< ?'),$str); //替换空格替换为
                return $str;
        }
        // 转义
        function ck_escape($str)
        {
                if (!get_magic_quotes_gpc())return addslashes($str);
                return $str;
        }
        // MD5加密
        public function ck_md5($str){
                return  MD5($str);
        }
        // base64加密
        public function ck_base64($str){
                return  base64_encode($str);
        }
        // 时间
        function ck_time($str){
                // time_r() 来在公用函数文件
                if(!is_numeric($str))
                {
                        return time_r($str);
                }
                else return $str;
        }
        // 有条件注销(数字)
        public function ck_cancel($str){
                return (!is_numeric($str))? $str:"";
        }
        // 无条件注销
        public function ck_delete(){
                return null;
        }
        // js错误提示
        private function jsError()
        {
                if(empty($this->error))return false;
                return  "
                <script  language=javascript> rn var error = new Array(".trim($this->error,',').");
                        rn for (i=0; i < error.length; i++){
                        rn document.getElementById(error[0]).innerHTML=error[1];
                         }rn </script>
                ";
        }
}

// 演示:
$form[1] =array(
'text'=>array('title','','产品名称','size=40','产品名称不可缺少!','Y','cn,1-30'),
'text1'=>array('categories','','产品名称','','','Y_base64'),
'select'=>array('superiors','||1|2|Y_3','产品类别|选择|1|2|3','','必选项','Y'),
'radio'=>array('superiors1','|1|Y_2|3','产品xun|产品1|产品2|产品3','','必选项','Y'),
'checkbox'=>array('superiors2',array(1=>'11',2=>'22',3=>'33'),'','','必选项','Y'),
'file'=>array('ddd','','文件'),
);
$form =array (
  'login' =>
  array (
    'text' =>
    array (
      0 => 'user',
      1 => '',
      2 => '用户名',
      3 => 'size=20',
      4 => '!',
      5 => 'Y',
      6 => 'numen,6-12',
    ),
    'password' =>
    array (
      0 => 'pass',
      1 => '',
      2 => '密 码',
      3 => 'size=22',
      4 => '密码格式错误!',
      5 => 'Y_md5',
      6 => 'numen,6-12',
    ),
    'radio' =>
    array (
      0 => 'time',
      1 => '|7200|3600|1800',
      2 => 'cookies有效时间|2小时|1小时|30分钟',
      3 => '',
      4 => '',
      5 => 'N_delete',
      6 => '',
    ),
  ),
  );

// 表单提交效验
$past = $_form->postForm($form['login']);
$dd = array('title'=>'标题','categories'=>'类别');
// $dd 为已有的信息(如更新时的信息输出) POST数据位内部处理具有优先权
if(!empty($past))
{
        echo "<pre>";
        print_r($past);
        echo"</pre>";
}
echo '<form method="POST" NAME="PostTopic" action="" enctype="multipart/form-data" style="margin:0px;">';
echo $_form->formHtml($form['login'],$dd);
echo '<input type="submit" value="Y" name="B1"></form>';
?>

我们可以使用extract()函数,比如在接收页面脚本的最前面加上extract($_POST);extract($_GET);这样的语句,导出几个用于表单处理的超级变量数组值,如以下代码所示:

@extract(i_addslashes($_POST), EXTR_OVERWRITE);
@extract(i_addslashes($_GET), EXTR_OVERWRITE);
@extract(i_addslashes($_COOKIE), EXTR_OVERWRITE);
@extract(i_addslashes($_SESSION), EXTR_OVERWRITE);

我们看一个使用extract导出为正常变量的脚本例子

<?php
// 将$_GET和$_POST超级变量数组获取的变量转为正常的变量,这样直接显示变量名称即可
extract($_GET);
extract($_POST);   
echo "您好, $username $age";
?>
<form action="" method="post">
姓名:<input type="text" name="username" id="username" />
年龄:<select name="age">
<option value=">16">小于16</option>
<option value="16-30" selected>16-30</option>
 
     <option value="31-50">31-50</option>
<option value="51-80">51-80</option>
</select></td>
<input type="submit" name="btn_submit" value="提交" />
</form> 

实现的界面如图5-5所示。

php extract()超级变量函数 

本章介绍什么是通配符、如何使用通配符以及怎样使用LIKE操作符进行通配搜索,以便对数据进行复杂过滤。

8.1  LIKE操作符

前面介绍的所有操作符都是针对已知值进行过滤的。不管是匹配一个还是多个值,测试大于还是小于已知值,或者检查某个范围的值,共同点是过滤中使用的值都是已知的。但是,这种过滤方法并不是任何时候都好用。例如,怎样搜索产品名中包含文本anvil的所有产品?用简单的比较操作符肯定不行,必须使用通配符。利用通配符可创建比较特定数据的搜索模式。在这个例子中,如果你想找出名称包含anvil的所有产品,可构造一个通配符搜索模式,找出产品名中任何位置出现anvil的产品。

通配符(wildcard) 用来匹配值的一部分的特殊字符。

搜索模式(search pattern)   由字面值、通配符或两者组合构成的搜索条件。

通配符本身实际是SQL的WHERE子句中有特殊含义的字符,SQL支持几种通配符。

为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。

谓词 操作符何时不是操作符?答案是在它作为谓词(predi- cate)时。从技术上说,LIKE是谓词而不是操作符。虽然最终的结果是相同的,但应该对此术语有所了解,以免在SQL文档中遇到此术语时不知道。

8.1.1  百分号(%)通配符

最常使用的通配符是百分号(%)。在搜索串中,%表示任何字符出现任意次数。例如,为了找出所有以词jet起头的产品,可使用以下SELECT语句:

php extract()超级变量函数 

此例子使用了搜索模式'jet%'。在执行这条子句时,将检索任意以jet起头的词。%告诉MySQL接受jet之后的任意字符,不管它有多少字符。

区分大小写  根据MySQL的配置方式,搜索可以是区分大小写的。如果区分大小写,'jet%'与JetPack 1000将不匹配。

通配符可在搜索模式中任意位置使用,并且可以使用多个通配符。下面的例子使用两个通配符,它们位于模式的两端:

php extract()超级变量函数 

搜索模式'%anvil%'表示匹配任何位置包含文本anvil的值,而不论它之前或之后出现什么字符。

通配符也可以出现在搜索模式的中间,虽然这样做不太有用。下面的例子找出以s起头以e结尾的所有产品:

php extract()超级变量函数 


重要的是要注意到,除了一个或多个字符外,%还能匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符。

注意尾空格  尾空格可能会干扰通配符匹配。例如,在保存词anvil时,如果它后面有一个或多个空格,则子句WHERE prod_name LIKE '%anvil'将不会匹配它们,因为在最后的l后有多余的字符。解决这个问题的一个简单的办法是在搜索模式最后附加一个%。一个更好的办法是使用函数(第11章将会介绍)去掉首尾空格。

注意NULL  虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL。即使是WHERE prod_name LIKE '%'也不能匹配用值NULL作为产品名的行。

str_replace只替换一次代码

$str ="中国|111cn.net|111cn.net|111cn.net|jkldajfklda李好,美女,世界中国中国中国

中国中国abc,dee";
$str1=array(
  array('111cn.net','/phper.html'),
  array('中国','/phper.html'),
  array('李好','/phper.html'),
  array('dee','/phper.html'),
  array('abc','/phper.html')
  );
//$temp = str_replace('111cn.net','前程似锦',$str,$a);
    $count =0;
 foreach($str1 as $nkeys){    
   if(strpos($str,$nkeys[0]) ){
    if( $count <=1 ){
     $str=preg_replace("/$nkeys[0]/","<a

href=http://111cn.net.com".$nkeys[1]." target=_blank >".$nkeys

[0]."</a>",$str,1);     $count++;
     continue ;
    }
    
    
    
   }
    
  }
 echo $count,$str;
//preg_replace(【要替换的关键字】, 【替换为的关键字】, 【原字符串】, 【替换次数

】);
//方法二:

function str_replace_once($needle, $replace, $haystack) {

   $pos = strpos($haystack, $needle);

   if ($pos === false) {

      return $haystack;

   }

   return substr_replace($haystack, $replace, $pos, strlen($needle));

}

[!--infotagslink--]

相关文章

  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • Django def clean()函数对表单中的数据进行验证操作

    这篇文章主要介绍了Django def clean()函数对表单中的数据进行验证操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-09
  • jQuery Real Person验证码插件防止表单自动提交

    本文介绍的jQuery插件有点特殊,防自动提交表单的验证工具,就是我们经常用到的验证码工具,先给大家看看效果。效果图如下: 使用说明 需要使用jQuery库文件和Real Person库文件 同时需要自定义验证码显示的CSS样式 使用实例...2015-11-08
  • JS实现随机生成验证码

    这篇文章主要为大家详细介绍了JS实现随机生成验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-06
  • PS怎么排除重叠图形

    PS排除重叠形状是什么意思?很多朋友都不是很清楚,其实方法很简单的,下面小编就为大家介绍介绍一下,不会的朋友可以参考本文,来看看吧。 步骤:1、在PS中,选择“矩形工具...2016-12-31
  • JavaScript实现密码框输入验证

    这篇文章主要为大家详细介绍了JavaScript实现密码框输入验证,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-01
  • Nest.js 授权验证的方法示例

    这篇文章主要介绍了Nest.js 授权验证的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-22
  • Jquery插件实现点击获取验证码后60秒内禁止重新获取

    通过jquery.cookie.js插件可以快速实现“点击获取验证码后60秒内禁止重新获取(防刷新)”的功能效果图:先到官网(http://plugins.jquery.com/cookie/)下载cookie插件,放到相应文件夹,代码如下:复制代码 代码如下: <!DOCTYPE ht...2015-03-15
  • php实现点击可刷新验证码

    验证码类文件 CreateImg.class.php <&#63;php class ValidationCode { private $width,$height,$codenum; public $checkcode; //产生的验证码 private $checkimage; //验证码图片 private $disturbColor = ''; /...2015-11-08
  • el-table树形表格表单验证(列表生成序号)

    这篇文章主要介绍了el-table树形表格表单验证(列表生成序号),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-01
  • 基于JavaScript实现验证码功能

    这篇文章主要介绍了基于JavaScript实现验证码功能的相关资料...2017-04-03
  • selenium 反爬虫之跳过淘宝滑块验证功能的实现代码

    这篇文章主要介绍了selenium 反爬虫之跳过淘宝滑块验证功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-27
  • vue element table中自定义一些input的验证操作

    这篇文章主要介绍了vue element table中自定义一些input的验证操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-18
  • js canvas实现滑块验证

    这篇文章主要为大家详细介绍了js canvas实现滑块验证,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-14
  • vue实现表单验证小功能

    这篇文章主要为大家详细介绍了vue实现表单验证小功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-29
  • 单击按钮发送验证码,出现倒计时的简单实例

    下面小编就为大家带来一篇单击按钮发送验证码,出现倒计时的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 代码...2017-07-06
  • Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法

    这篇文章主要介绍了Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-06-24
  • PHP验证码生成与验证例子

    验证码是一个现在WEB2.0中常见的一个功能了,像注册、登录又或者是留言页面,都需要注册码来验证当前操作者的合法性,我们会看到有些网站没有验证码,但那是更高级的验证了,...2016-11-25
  • 基于Pytorch版yolov5的滑块验证码破解思路详解

    这篇文章主要介绍了基于Pytorch版yolov5的滑块验证码破解思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-25
  • jQuery实现发送验证码控制按钮禁用功能

    最近接到新需求,需要实现一个点击发送验证码之后,按钮禁用,在5秒之后取消禁用,看似需求很简单,实现起来还真的好好动动脑筋,下面小编把jquery控制按钮禁用核心代码分享给大家,需要的朋友参考下吧...2021-07-24