在PHP出现至今,一直在不断的更新版本,增加新的功能,供我们大家使用,满足我们的需求。PHP 5.2以及更高的版本,PHP filter被绑定于系统,它可以对数据进行自动的过滤和判断。
第一种、PHP filter判断一个变量的内容是否符合要求
使用函数filter_var,第一个参数是要判断的变量。第二个参数是判断的要求,FILTER_VALIDATE_EMAIL表示判断是否符合email格式。如果变量是类似’boy@163.com’的数据,系统就会完整的输出‘boy@163.com’。如果是错误的格式,比如’boy’,就会输出false。如果没有填写表单中的email字段,系统输出空字符串。
$email = ‘boy@163.com’;
echo filter_var($email,
FILTER_VALIDATE_EMAIL);
第二种、PHP filter根据要求过滤一个变量的内容
和上面唯一的不同是第二个参数使用FILTER_SANITIZE_EMAIL,输出的结果会不同。如果变量是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy-afds3′,只要是数字和字母和划线等email格式中可以出现的内容,系统同样会完整的输出’boy-afds3′。如果变量没有设置内容,系统输出空字符串。如果是’boy阿三’,系统会把email格式中不允许的东西去除,输出’boy’。
$email = ‘boy@163.com’;
echo filter_var($email,
FILTER_SANITIZE_EMAIL);
第三种、PHP filter判断输入的变量的内容是否符合要求
使用函数filter_input。第一个参数表示从那里获得的数据,INPUT_POST表示通过POST方法传递过来,还可以使用INPUT_GET, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV,代表相应的途径。第二个参数就是数据的名称。第三个参数代表过滤的要求,FILTER_VALIDATE_EMAIL表示判断数据是否符合email格式。
假设通过表单的POST过来的一个字段email。如果是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy’,就会输出false。如果没有填写表单中的email字段,系统输出null,也就是空。
echo filter_input(INPUT_POST,
‘email’, FILTER_VALIDATE_EMAIL);
第四种、PHP filter根据要求过滤输入的变量的内容
和上面唯一的不同是第二个参数使用FILTER_SANITIZE_EMAIL,输出的结果会不同。假设通过表单的POST过来的一个字段email。
如果是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy-afds3′,只要是数字和字母和划线等email格式中可以出现的内容,系统同样会完整的输出’boy-afds3′。如果没有填写表单中的email字段,系统输出null,也就是空。如果是’boy阿三’源码天空,系统会把email格式中不允许的东西去除,输出’boy’。
echo filter_input
(INPUT_POST, ‘email’,
FILTER_SANITIZE_EMAIL);
以上就是PHP filter的具体功能介绍,希望对又需要的朋友有所帮助。
来自:http://www.codesky.net/article/200912/140526.html
php5.20之后增加了一个filter过滤器的扩展,主要用于验证和过滤数据,通常用于用户提交的表单数据,COOKIE等。这对提高程序的安全性和远离SQL注入带来了极大的好处。LFilter类在调用filter API的基础上,封装一个较为完整的类。拿来和大家分享,欢迎指正。注意:filter对于$_FILES 上传文件的类型数据,无法过滤。下面是一个使用Filter自己封装的类。
在本例中,我们使用 filter_input_array() 函数来过滤三个 POST 变量。所接受的 POST 变量是姓名、年龄以及电子邮件地址:
输出类似:
Array
(
[name] => Peter
[age] => 41
[email] => peter@example.com
)
来源:http://www.cardii.net/php-filter
第一种、PHP filter判断一个变量的内容是否符合要求
使用函数filter_var,第一个参数是要判断的变量。第二个参数是判断的要求,FILTER_VALIDATE_EMAIL表示判断是否符合email格式。如果变量是类似’boy@163.com’的数据,系统就会完整的输出‘boy@163.com’。如果是错误的格式,比如’boy’,就会输出false。如果没有填写表单中的email字段,系统输出空字符串。
$email = ‘boy@163.com’;
echo filter_var($email,
FILTER_VALIDATE_EMAIL);
第二种、PHP filter根据要求过滤一个变量的内容
和上面唯一的不同是第二个参数使用FILTER_SANITIZE_EMAIL,输出的结果会不同。如果变量是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy-afds3′,只要是数字和字母和划线等email格式中可以出现的内容,系统同样会完整的输出’boy-afds3′。如果变量没有设置内容,系统输出空字符串。如果是’boy阿三’,系统会把email格式中不允许的东西去除,输出’boy’。
$email = ‘boy@163.com’;
echo filter_var($email,
FILTER_SANITIZE_EMAIL);
第三种、PHP filter判断输入的变量的内容是否符合要求
使用函数filter_input。第一个参数表示从那里获得的数据,INPUT_POST表示通过POST方法传递过来,还可以使用INPUT_GET, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV,代表相应的途径。第二个参数就是数据的名称。第三个参数代表过滤的要求,FILTER_VALIDATE_EMAIL表示判断数据是否符合email格式。
假设通过表单的POST过来的一个字段email。如果是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy’,就会输出false。如果没有填写表单中的email字段,系统输出null,也就是空。
echo filter_input(INPUT_POST,
‘email’, FILTER_VALIDATE_EMAIL);
第四种、PHP filter根据要求过滤输入的变量的内容
和上面唯一的不同是第二个参数使用FILTER_SANITIZE_EMAIL,输出的结果会不同。假设通过表单的POST过来的一个字段email。
如果是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy-afds3′,只要是数字和字母和划线等email格式中可以出现的内容,系统同样会完整的输出’boy-afds3′。如果没有填写表单中的email字段,系统输出null,也就是空。如果是’boy阿三’源码天空,系统会把email格式中不允许的东西去除,输出’boy’。
echo filter_input
(INPUT_POST, ‘email’,
FILTER_SANITIZE_EMAIL);
以上就是PHP filter的具体功能介绍,希望对又需要的朋友有所帮助。
来自:http://www.codesky.net/article/200912/140526.html
php5.20之后增加了一个filter过滤器的扩展,主要用于验证和过滤数据,通常用于用户提交的表单数据,COOKIE等。这对提高程序的安全性和远离SQL注入带来了极大的好处。LFilter类在调用filter API的基础上,封装一个较为完整的类。拿来和大家分享,欢迎指正。注意:filter对于$_FILES 上传文件的类型数据,无法过滤。下面是一个使用Filter自己封装的类。
在本例中,我们使用 filter_input_array() 函数来过滤三个 POST 变量。所接受的 POST 变量是姓名、年龄以及电子邮件地址:
输出类似:
Array
(
[name] => Peter
[age] => 41
[email] => peter@example.com
)
来源:http://www.cardii.net/php-filter
<?php
class LFilter
{
private static $_options = array(
'int' => FILTER_VALIDATE_INT,//validate value as integer
'bool' => FILTER_VALIDATE_BOOLEAN,//retrun true for "1","true","on","yes"
'float' => FILTER_VALIDATE_FLOAT,//validate value as float
'regexp'=> FILTER_VALIDATE_REGEXP,
'url' => FILTER_VALIDATE_URL,//validate value as url
'email' => FILTER_VALIDATE_EMAIL,//validate value as e-mail
'ip' => FILTER_VALIDATE_IP,//validate value as IP address
'string' => FILTER_SANITIZE_STRING,
'stripped'=> FILTER_SANITIZE_STRIPPED,
'encoded' => FILTER_SANITIZE_ENCODED,//URL-encode string,optionally strip or encode special characters
'chars' => FILTER_SANITIZE_SPECIAL_CHARS,
'semail' => FILTER_SANITIZE_EMAIL,//remove all characters except letters,digits and !#$%&'*+-/=?^_`{|}~@.[]
'url' => FILTER_SANITIZE_URL,
'sint' => FILTER_SANITIZE_NUMBER_INT,
'sfloat' => FILTER_SANITIZE_NUMBER_FLOAT,//Remove all characters except digits,+- and optionally .eE
'quotes' => FILTER_SANITIZE_MAGIC_QUOTES,//Apply addslashes()
'octal' => FILTER_FLAG_ALLOW_OCTAL,
'hex' => FILTER_FLAG_ALLOW_HEX,
'slow' => FILTER_FLAG_STRIP_LOW,
'shigh' => FILTER_FLAG_STRIP_HIGH,
'elow' => FILTER_FLAG_ENCODE_LOW,
'ehigh' => FILTER_FLAG_ENCODE_HIGH,
'eamp' => FILTER_FLAG_ENCODE_AMP,
'noquotes'=> FILTER_FLAG_NO_ENCODE_QUOTES,
'null' => FILTER_FLAG_EMPTY_STRING_NULL,
'fraction'=> FILTER_FLAG_ALLOW_FRACTION,
'thousand'=> FILTER_FLAG_ALLOW_THOUSAND,
'scientific'=> FILTER_FLAG_ALLOW_SCIENTIFIC,
'srequired' => FILTER_FLAG_SCHEME_REQUIRED,
'ipv4' => FILTER_FLAG_IPV4,
'ipv6' => FILTER_FLAG_IPV6,
'callback' => FILTER_CALLBACK,
'array' => FILTER_REQUIRE_ARRAY
);
private static $_data=array();
private static $_flag=array();
public static function getOption($key)
{
if(array_key_exists($key,self::$_options))
return self::$_options[$key];
return NULL;
}
/**
* getInt 验证$_GET变量是否是整数
* e.g.
* <code>
* LFilter::getInt('id');
* </code>
*
* @param string $field
* @param int $min
* @param int $max
* @access public
* @return bool
*/
public static function getInt($int,$min=null,$max=null)
{
if($min||$max) self::$_data=array('min_range'=>$min,'max_range'=>$max);
return filter_input(INPUT_GET,$int,self::getOption('int'),self::$_data);
}
/**
* checkInt 检查$int变量是否是整数
* e.g.
* <code>
* LFilter::checkInt($_GET['id']);
* LFilter::checkInt($_GET['id'],20,2000);
* </code>
*
* @param var $int
* @param int $min
* @param int $max
* @static
* @access public
* @return bool
*/
public static function checkInt($int,$min=null,$max=null)
{
if($min||$max) self::$_data=array('min_range'=>$min,'max_range'=>$max);
return filter_var($int,self::getOption('int'),self::$_data);
}
/**
* postInt 检查$_POST变量是否是整数
* <code>
* LFilter::postInt('id');
* </code>
*
* @param string $int
* @param int $min
* @param int $max
* @static
* @access public
* @return bool
*/
public static function postInt($int,$min=null,$max=null)
{
if($min||$max) self::$_data=array('min_range'=>$min,'max_range'=>$max);
return filter_input(INPUT_POST,$int,self::getOption('int'),self::$_data);
}
/**
* getString 检查$_GET变量是否为字符串
* <code>
* LFilter::getString('name');
* LFilter::getString('name','chars');
* </code>
*
* @param mixed $str
* @param string $type
* @static
* @access public
* @return void
*/
public static function getString($str,$type='string') {
return filter_input(INPUT_GET,$str,self::getOption($type));
}
/**
* checkString 检测变量是否为字符串
*
* @param string $string
* @param string $type
* @param array $flag
* @static
* @access public
* @return void
*/
public static function checkString($string,$type='string',$flag=array())
{
return filter_var($string,self::getOption($type));
}
/**
* postString 检测$_POST变量是否为字符串
*
* @param mixed $string
* @param string $type
* @param array $flag
* @static
* @access public
* @return void
*/
public static function postString($string,$type='string',$flag=array())
{
return filter_input(INPUT_POST,$string,self::getOption($type));
}
/**
* postFloat 检测是否为浮点数
* <code>
* LFilter::postFloat('price');
* </code>
*
* @param mixed $float
* @param mixed $decimal
* @param mixed $allow
* @static
* @access public
* @return void
*/
public static function postFloat($float,$decimal=null,$allow=true)
{
if($decimal) self::$_data['options']['decimal']=$decimal;
self::$_data['flags']=self::getOption('thousand');
return filter_input(INPUT_POST,$float,self::getOption('float'),self::$_data);
}
public static function getFloat($float,$decimal=null,$allow=true)
{
if($decimal) self::$_data['options']['decimal']=$decimal;
self::$_data['flags']=self::getOption('thousand');
return filter_input(INPUT_GET,$float,self::getOption('float'),self::$_data);
}
public static function checkFloat($float,$decimal=null,$allow=true)
{
if($decimal) self::$_data['options']['decimal']=$decimal;
self::$_data['flags']=self::getOption('thousand');
return filter_var($float,self::getOption('float'),self::$_data);
}
public static function postEmail($email)
{
return filter_input(INPUT_POST,$email,self::getOption('email'));
}
public static function getEmail($email)
{
return filter_input(INPUT_GET,$email,self::getOption('email'));
}
public static function checkEmail($email)
{
return filter_var($email,self::getOption('email'));
}
public static function postUrl($url)
{
return filter_input(INPUT_POST,$url,self::getOption('url'));
}
public static function getUrl($url)
{
return filter_input(INPUT_GET,$url,self::getOption('url'));
}
public static function checkUrl($url)
{
return filter_var($url,self::getOption('url'));
}
public static function postIp($ip)
{
return filter_input(INPUT_POST,$ip,self::getOption('ip'));
}
public static function getIp($ip)
{
return filter_input(INPUT_GET,$ip,self::getOption('ip'));
}
public static function checkIp($ip)
{
return filter_var($ip,self::getOption('ip'));
}
/**
* postArray 对$_POST形式$args数组进行过滤,返回数组
* eg:
* <code>
* $args = array(
* 'productId' => 'int',
* 'name' => 'string',
* 'tagId' => array('int','array'),
* 'price' => array('float')
* );
* LFilter::postArray($args);
* </code>
*
* @param string $args
* @access public
* @return array
*/
public function postArray($args,$type=false)
{
if(empty($_POST)) return NULL;
return filter_input_array(INPUT_POST,self::getArrayArgs($args));
}
public function getArray($args,$type=false) {
if ( empty($_GET) ) return NULL;
return filter_input_array(INPUT_GET,self::getArrayArgs($args));
}
/**
* filterVarArray 对数据$data,以$args数组条件进行过滤,返回数组
*
* eg:
* <code>
* $data = array(
* 'product_id' => 'libgd<script>',
* 'component' => '10',
* 'versions' => '2.0.33',
* 'testscalar' => array('2', '23', '10', '12'),
* 'testarray' => '2',
* );
* $args = array(
* 'product_id' => 'string',
* 'component' => array('int','',array('min_range' => 1, 'max_range' => 11)),
* 'testscalar' => array('int','array'),
* 'testarray' => array('int','array')
* );
* LFilter::checkArray($data,$args);
* </code>
*
* @param mixed $args
* @access public
* @return array
*/
public function checkArray($data,$args,$type=false) {
if(empty($data)) return NULL;
$defs = self::getArrayArgs($args,$type);
return filter_var_array($data,$defs);
}
/**
* getArrayArgs 将过滤条件转换成filter函数处理的数组
*
* @param mixed $args
* @access public
* @return array
*/
public static function getArrayArgs($args,$type=null) {
$defs = array();
foreach ($args as $key => $arg) {
if(!is_array($arg)) $arg = array($arg);
if(isset($arg[0])) $defs[$key]['filter'] = self::getOption($arg[0]);
if(isset($arg[1])) $defs[$key]['flags'] = self::getOption($arg[1]);
if(isset($arg[2])) $defs[$key]['options'] = self::getOption($arg[2]);
}
return $defs;
}
}
?>
class LFilter
{
private static $_options = array(
'int' => FILTER_VALIDATE_INT,//validate value as integer
'bool' => FILTER_VALIDATE_BOOLEAN,//retrun true for "1","true","on","yes"
'float' => FILTER_VALIDATE_FLOAT,//validate value as float
'regexp'=> FILTER_VALIDATE_REGEXP,
'url' => FILTER_VALIDATE_URL,//validate value as url
'email' => FILTER_VALIDATE_EMAIL,//validate value as e-mail
'ip' => FILTER_VALIDATE_IP,//validate value as IP address
'string' => FILTER_SANITIZE_STRING,
'stripped'=> FILTER_SANITIZE_STRIPPED,
'encoded' => FILTER_SANITIZE_ENCODED,//URL-encode string,optionally strip or encode special characters
'chars' => FILTER_SANITIZE_SPECIAL_CHARS,
'semail' => FILTER_SANITIZE_EMAIL,//remove all characters except letters,digits and !#$%&'*+-/=?^_`{|}~@.[]
'url' => FILTER_SANITIZE_URL,
'sint' => FILTER_SANITIZE_NUMBER_INT,
'sfloat' => FILTER_SANITIZE_NUMBER_FLOAT,//Remove all characters except digits,+- and optionally .eE
'quotes' => FILTER_SANITIZE_MAGIC_QUOTES,//Apply addslashes()
'octal' => FILTER_FLAG_ALLOW_OCTAL,
'hex' => FILTER_FLAG_ALLOW_HEX,
'slow' => FILTER_FLAG_STRIP_LOW,
'shigh' => FILTER_FLAG_STRIP_HIGH,
'elow' => FILTER_FLAG_ENCODE_LOW,
'ehigh' => FILTER_FLAG_ENCODE_HIGH,
'eamp' => FILTER_FLAG_ENCODE_AMP,
'noquotes'=> FILTER_FLAG_NO_ENCODE_QUOTES,
'null' => FILTER_FLAG_EMPTY_STRING_NULL,
'fraction'=> FILTER_FLAG_ALLOW_FRACTION,
'thousand'=> FILTER_FLAG_ALLOW_THOUSAND,
'scientific'=> FILTER_FLAG_ALLOW_SCIENTIFIC,
'srequired' => FILTER_FLAG_SCHEME_REQUIRED,
'ipv4' => FILTER_FLAG_IPV4,
'ipv6' => FILTER_FLAG_IPV6,
'callback' => FILTER_CALLBACK,
'array' => FILTER_REQUIRE_ARRAY
);
private static $_data=array();
private static $_flag=array();
public static function getOption($key)
{
if(array_key_exists($key,self::$_options))
return self::$_options[$key];
return NULL;
}
/**
* getInt 验证$_GET变量是否是整数
* e.g.
* <code>
* LFilter::getInt('id');
* </code>
*
* @param string $field
* @param int $min
* @param int $max
* @access public
* @return bool
*/
public static function getInt($int,$min=null,$max=null)
{
if($min||$max) self::$_data=array('min_range'=>$min,'max_range'=>$max);
return filter_input(INPUT_GET,$int,self::getOption('int'),self::$_data);
}
/**
* checkInt 检查$int变量是否是整数
* e.g.
* <code>
* LFilter::checkInt($_GET['id']);
* LFilter::checkInt($_GET['id'],20,2000);
* </code>
*
* @param var $int
* @param int $min
* @param int $max
* @static
* @access public
* @return bool
*/
public static function checkInt($int,$min=null,$max=null)
{
if($min||$max) self::$_data=array('min_range'=>$min,'max_range'=>$max);
return filter_var($int,self::getOption('int'),self::$_data);
}
/**
* postInt 检查$_POST变量是否是整数
* <code>
* LFilter::postInt('id');
* </code>
*
* @param string $int
* @param int $min
* @param int $max
* @static
* @access public
* @return bool
*/
public static function postInt($int,$min=null,$max=null)
{
if($min||$max) self::$_data=array('min_range'=>$min,'max_range'=>$max);
return filter_input(INPUT_POST,$int,self::getOption('int'),self::$_data);
}
/**
* getString 检查$_GET变量是否为字符串
* <code>
* LFilter::getString('name');
* LFilter::getString('name','chars');
* </code>
*
* @param mixed $str
* @param string $type
* @static
* @access public
* @return void
*/
public static function getString($str,$type='string') {
return filter_input(INPUT_GET,$str,self::getOption($type));
}
/**
* checkString 检测变量是否为字符串
*
* @param string $string
* @param string $type
* @param array $flag
* @static
* @access public
* @return void
*/
public static function checkString($string,$type='string',$flag=array())
{
return filter_var($string,self::getOption($type));
}
/**
* postString 检测$_POST变量是否为字符串
*
* @param mixed $string
* @param string $type
* @param array $flag
* @static
* @access public
* @return void
*/
public static function postString($string,$type='string',$flag=array())
{
return filter_input(INPUT_POST,$string,self::getOption($type));
}
/**
* postFloat 检测是否为浮点数
* <code>
* LFilter::postFloat('price');
* </code>
*
* @param mixed $float
* @param mixed $decimal
* @param mixed $allow
* @static
* @access public
* @return void
*/
public static function postFloat($float,$decimal=null,$allow=true)
{
if($decimal) self::$_data['options']['decimal']=$decimal;
self::$_data['flags']=self::getOption('thousand');
return filter_input(INPUT_POST,$float,self::getOption('float'),self::$_data);
}
public static function getFloat($float,$decimal=null,$allow=true)
{
if($decimal) self::$_data['options']['decimal']=$decimal;
self::$_data['flags']=self::getOption('thousand');
return filter_input(INPUT_GET,$float,self::getOption('float'),self::$_data);
}
public static function checkFloat($float,$decimal=null,$allow=true)
{
if($decimal) self::$_data['options']['decimal']=$decimal;
self::$_data['flags']=self::getOption('thousand');
return filter_var($float,self::getOption('float'),self::$_data);
}
public static function postEmail($email)
{
return filter_input(INPUT_POST,$email,self::getOption('email'));
}
public static function getEmail($email)
{
return filter_input(INPUT_GET,$email,self::getOption('email'));
}
public static function checkEmail($email)
{
return filter_var($email,self::getOption('email'));
}
public static function postUrl($url)
{
return filter_input(INPUT_POST,$url,self::getOption('url'));
}
public static function getUrl($url)
{
return filter_input(INPUT_GET,$url,self::getOption('url'));
}
public static function checkUrl($url)
{
return filter_var($url,self::getOption('url'));
}
public static function postIp($ip)
{
return filter_input(INPUT_POST,$ip,self::getOption('ip'));
}
public static function getIp($ip)
{
return filter_input(INPUT_GET,$ip,self::getOption('ip'));
}
public static function checkIp($ip)
{
return filter_var($ip,self::getOption('ip'));
}
/**
* postArray 对$_POST形式$args数组进行过滤,返回数组
* eg:
* <code>
* $args = array(
* 'productId' => 'int',
* 'name' => 'string',
* 'tagId' => array('int','array'),
* 'price' => array('float')
* );
* LFilter::postArray($args);
* </code>
*
* @param string $args
* @access public
* @return array
*/
public function postArray($args,$type=false)
{
if(empty($_POST)) return NULL;
return filter_input_array(INPUT_POST,self::getArrayArgs($args));
}
public function getArray($args,$type=false) {
if ( empty($_GET) ) return NULL;
return filter_input_array(INPUT_GET,self::getArrayArgs($args));
}
/**
* filterVarArray 对数据$data,以$args数组条件进行过滤,返回数组
*
* eg:
* <code>
* $data = array(
* 'product_id' => 'libgd<script>',
* 'component' => '10',
* 'versions' => '2.0.33',
* 'testscalar' => array('2', '23', '10', '12'),
* 'testarray' => '2',
* );
* $args = array(
* 'product_id' => 'string',
* 'component' => array('int','',array('min_range' => 1, 'max_range' => 11)),
* 'testscalar' => array('int','array'),
* 'testarray' => array('int','array')
* );
* LFilter::checkArray($data,$args);
* </code>
*
* @param mixed $args
* @access public
* @return array
*/
public function checkArray($data,$args,$type=false) {
if(empty($data)) return NULL;
$defs = self::getArrayArgs($args,$type);
return filter_var_array($data,$defs);
}
/**
* getArrayArgs 将过滤条件转换成filter函数处理的数组
*
* @param mixed $args
* @access public
* @return array
*/
public static function getArrayArgs($args,$type=null) {
$defs = array();
foreach ($args as $key => $arg) {
if(!is_array($arg)) $arg = array($arg);
if(isset($arg[0])) $defs[$key]['filter'] = self::getOption($arg[0]);
if(isset($arg[1])) $defs[$key]['flags'] = self::getOption($arg[1]);
if(isset($arg[2])) $defs[$key]['options'] = self::getOption($arg[2]);
}
return $defs;
}
}
?>
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/3728/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2013-11-13 18:25
评论列表