我同学写的一个表单验证类,觉得不错,



[复制到剪切板]
CODE:
<?
################表单处理,字符格式处理,出入数据库字符处理
class FormCheck
{
    
/*
    *主处理函数方法
    *&$str:等待处理的数据,可以为:进数据库的单变量或者一维数组;可为出数据库的单变量或者一,二维数组,和其他变量
    *    但是,在调用时:任何其它表达式和常量都不能通过引用传递;
    *$name:in(进数据库) out(出数据库) char(判断是否是字母字符串) num(判断是否是数字字符串) num_char(字母数字) email  url(url验证) id(id验证) other(只进行一般的处理) ubb等
    *    具体的处理见相关的函数
    *$mode:出错的提示方式
    *$mess:出错提示信息
    *$no_html:是否把html代码htmlspecialchars 默认 1 为是, 0为不是;当不要时记得把他设置为0
    *
    *注意: $str为 传地址 方式
    *更新日期:2006/08/23
    *write by knight 
    */
    
function check(&$str,$name,$mode=1,$mess="formcheck 类中提示:你输入了不合理的字符",$no_html=1)
    {
        if(
$name=="in" || $name=="out")
        {
            
$name.="_db";
            
$str=$this->$name($str);
            return 
$str;
        }
        else 
        {
            
$str=trim($str);
            
$name="if_".$name;
            if(!
$this->$name($str))
            {
                switch(
$mode)
                    {
                        case 
"0";
                            return 
0;
                            break;
                        case 
"1":
                            echo 
"<script> alert(\"$mess\");history.back();<\/script>";    
                            exit();
                            break;
                        case 
"2";
                            die(
"$mess");
                        default:
                            return 
0;    
                    }
            }
            else 
            {
                if(
$no_html==1)
                {
                    
$str=htmlspecialchars($str);
                    
$str=nl2br($str);
                }
                return 
$str;
            }
        }
    }
    
/*
    * 数据进库 转义 特殊字符 
    * $data 可为字符串 或 一维数组 如:$_GET $_POST
    */
    
function in_db(&$data,$mode=0)//&表示引用,相当于c中的传地址
    
{
        if(!
get_magic_quotes_gpc() || $mode=1//当 magic_quotes_gpc 开启时,所有的 ' (单引号), " (双引号), \ (反斜线) and 空字元会自动转为含有反斜线的溢出字元。
        
{
            if (
is_array($data))
            {
                foreach (
$data as $k => $v)
                {
                    
$data[$k] = addslashes($v);
                }
            }
            else
            {
                
$data addslashes($data);
            }
        }
        return 
$data;
    }
    
    
/*
    * 数据出库 还原 特殊字符 
    * $data  可为字符串 或 一/二维数组
    */
    
function out_db(&$data)
    {
        if (
is_array($data)) 
        {
            foreach (
$data as $k1 => $v1)
            {
                if (
is_array($v1))
                {
                    foreach (
$v1 as $k2 => $v2)
                    {
                        
$data[$k1][$k2] = stripslashes($v2);
                    }
                }
                else
                {
                    
$data[$k1] = stripslashes($v1);
                }
            }
        }
        else
        {
            
$data stripslashes($data);
        }
        Return 
$data;
    }
    
/*
    *验证指定长度的数字 
    *如 if_num("123a",1,5) 表示:"123a"是否是1到5位长的数字。
    *默认为任意不为空的长度
    */
    
function if_num($str,$starNum1=1,$endNum=""
    { 
       return 
preg_match("/^[0-9]{".$num1.",".$num2."}$/",$str)?1:0;
    }
    
/*输入 id 安全验证*/
    
function if_id($str)
    {
        if(
$str=="" || !is_numeric($str))
            return 
0;
        else 
            return 
1;
    }  
    
/*
    *验证是否为指定长度的字母/数字组合
    *如 if_num_char("123a",1,5) 表示:"123a"是否是1到5位长的字母数字组合。
    *默认为任意不为空的长度
    */
    
function if_num_char($str,$startNum=1,$endNum=""
    { 
        Return 
preg_match("/^[a-zA-Z0-9]{".$num1.",".$num2."}$/",$str)?1:0
    } 
    
/*
    *验证是否为指定长度的字母组合 ;默认为任意不为空的长度
    */
    
function if_char($str,$num1=1,$num2="")
    {
        Return 
preg_match("/^[a-zA-Z]{".$num1.",".$num2."}$/",$str)?1:0
    }
    
/*
    *验证邮件地址 
    */
    
function if_email($str)
    { 
        return 
preg_match('/^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,4}$/',$str)?1:0
    } 
    
/*
    *验证url地址 
    */
    
function if_url($str)
    {
         return (
preg_match("/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/",$str))?1:0
    }
    
/*
    *ubb处理;结合专有的ubb编辑器
    */
    
function ubb($String,$bColor="#f8f8f8")
    {
        
$String str_replace("│","|",$String);
        
//$String = str_replace("&amp;nbsp;","",$String);
        
$String preg_replace("/\[b\](.+?)\[\/b\]/is","<b>\\1</b>",$String);
        
$String preg_replace("/\[i\](.+?)\[\/i\]/is","<i>\\1</i>",$String);
        
$String preg_replace("/\[u\](.+?)\[\/u\]/is","<u>\\1</u>",$String);
        
$String preg_replace("/\[center\](.+?)\[\/center\]/is","<center>\\1</center>",$String);
        
$String preg_replace("/\[url\](http:\/\/.+?)\[\/url\]/is","<a href=\\1 target=blank>\\1</a>",$String);
        
$String preg_replace("/\[email\](.+?)\[\/email\]/is","<a href=mailto:\\1>\\1</a>",$String);
        
$String preg_replace("/\[img\](.+?)\[\/img\]/is","<a href=\\1 target=blank><img src=\\1 border=0 title=点击放大观看></a>",$String);
        
$String preg_replace("/\[code\](.+?)\[\/code\]/is","<table cellspacing='0' cellpadding='0' border='0' width='100%' bgcolor='{$bColor}' align='center'><tr><td><table border='0' cellspacing='1' cellpadding='4' width='100%'><tr><td class='tbnei' align='left'><font color='#666666'>Code:</font><br>\\1</td></tr></table></td></tr></table>",$String);
        
$String preg_replace("/\[color=(.+?)\](.+?)\[\/color\]/is","<font color=\\1>\\2</font>",$String);
        return 
$String;
    }
    
/*
    *几个别名函数方法
    */
    
function if_in(&$data)
    {
        
$this->in_db(&$data);
    }
    function 
if_out()
    {
        
$this->out_db(&$data);
    }
    function 
if_ubb($String)
    {
        
$this->ubb($String);
    }
    
/*等等其他都可以加进来*/
    /*
    *其他验证,当不需要任何特需的验证,而只是,trim,htmlspecialchars,nl2br
    */
    
function if_other($str)
    {
        if(
$str==""
            return 
0;
        else
            return 
1
    }
}
//end FormCheck()
/*
//几个应用
1:表单提交入数据库(post)
    $str=new FormCheck();
    //整个入数据库准备
    $str->check($_POST,'in');//    为 传地址方式,作用,把提交数据一次性addslashes
        print_r ($_POST);//测试下,看是否有addslashes的效果
        
    //内容处理1,要htmlspecialchars
    $_POST['content']=$str->check($_POST['content'],'other',1,"不能为空",1);//内容处理:trim,为空检查,htmlspecialchars,nl2br

    //内容处理1,不要htmlspecialchars,某些编辑器中要求
    $_POST['mycontent']=$str->check($_POST['mycontent'],'other',1,"不能为空",0);

    //其他特需处理 -email
    $str->check($_POST['myemail'],'email',1,"email格式不对",0);

    //其他特需处理 -判断数字1-使用统一的方法
    $str->check($_GET['mynum'],'num',1,"不是数字{$_GET['mynum']}",0);

    //其他特需处理 -判断数字2-直接调用方法-可以判断1~5位之间的数字,可用于电话位数判断等
    $str->if_num($_POST['mynum'],1,5);
    //等等其他方法,你也可以添加函数进去.

2: 数据出库处理
    $mess=$db->f1("select * from my_info");//$mess为一个二维数组

    $str->check($mess,'out');//$mess 可以为 1,2维数组和变量
        print_r ($mess);//测试下,看是否有stripslashes的效果

3: 数据出库处理并且显示ubb效果
    //二维情况结合smarty
    $mess=$db->f1("select * from my_info");//$mess为一个二维数组
    $str->check($mess,'out');
    $smarty->assign("gbooklist",$mess);

    html中:
    {section name=id loop=$gbooklist}
        {$gbooklist[id].content|ubb}{*注意:ubb是knight加进去的扩展,请从服务器下载或者联系jkh*}
    {sectionelse}没有任何对应数据! {/section}

    //一维情况,没有结合 smarty
    $mess=$db->f($db->q("select * from my_info where info_id=1"));//$mess为一个1维数组
    $str->check($mess,'out');
    $mess['content']=$str->check($mess['content'],"ubb",,"",0);
        //或者直接
    $mess['content']=$str->ubb($mess['content']);    

4:关于id验证,输入id必须验证,否则有数据库有注入的危险。
    你可以使用与本类无关的 verifyid($id,$mode=1)函数(见上),也可以使用本类。

    $_GET['id']=$str->check($_GET['id'],"id",1,"id有错",0);

    或者直接,建议使用上者,代码简单。
    if(!$str->if_id($_GET['id'])
    {
        $tiao->t("1","id有错");
    }
5:总之,如果要灵活使用,你必须看看这个类;如果有好的想法或者发现了某个bug,请你联系knight
*/

?> ;