<?
################表单处理,字符格式处理,出入数据库字符处理
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("&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
*/
?> ;