<?php

$rules = [
"ip" => function ($var) {return ip2long($var);},
"email" => function ($var) {return filter_var($var, FILTER_VALIDATE_EMAIL);},
"username" => function ($var) {return preg_match("/^[a-zA-Z0-9]*$/", $var);},
"password" => function ($var) {return (strlen($var) <= 30) ? true : false;},
"mobile" => function ($var) {return preg_match("/^\d{3}\d?-?\d{10}$/", $var);},
"cid" => function ($var) {return preg_match("/^[1-9][0-9]{16}[0-9xX]$/", $var);},
"number" => function ($var) {return is_numeric($var);},
"int" => function ($var) {return is_numeric($var) ? (preg_match("/[.ex]/", strval($var)) ? false : true):fasle;},
"string" => function ($var) {return is_string($var);},
"time" => function ($var) {return strtotime($var);},
"url" => function ($var) {return preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $var);},
"strrange" => function ($var) {global $_rngstart, $_rngend;return (strlen($var) >= $_rngstart && strlen($var) <= $_rngend) ? true : false;},
"numrange" => function ($var) {global $_rngstart, $_rngend;return ($var >= $_rngstart && $var <= $_rngend) ? true : false;},
"required" => function ($var) {return is_null($var) ? false : true;},
];
$gValidateErrs = [];
$_rngstart = 0;
$_rngend = 0;
function fnvalidate($filter, $input) {
global $rules, $gValidateErrs, $_rngstart, $_rngend;
foreach ($filter as $k => $v) {
if (is_string($v)) {
if (preg_match_all("/strrange\((\d*)\s?,\s?(\d*)\)/", $v, $matches)) {
$_rngstart = $matches[1][0];
$_rngend = $matches[2][0];
} elseif (preg_match_all("/numrange\((\d*)\s?,\s?(\d*)\)/", $v, $matches)) {
$_rngstart = $matches[1][0];
$_rngend = $matches[2][0];
}
$v = preg_replace("/\(.*?\)/", "", $v);
$rls = explode(" ", $v);
if (in_array("required", $rls)) {
if (isset($input[$k])) {
foreach ($rls as $r) {
if (!$rules[$r]($input[$k])) {
array_push($gValidateErrs, [$k, $r]);
}
}
} else {
array_push($gValidateErrs, [$k, "required"]);
}
} else {
if (isset($input[$k])) {
foreach ($rls as $r) {
if (!$rules[$r]($input[$k])) {
unset($input[$k]);
}
}
}
}
} else {
if (is_array($v)) {
fnvalidate($v, $input[$k]);
} else {
if (is_callable($v)) {
$v($input[$k]);
}
}
}
}
}
//test;
$filter = [
"p" => "numrange(1,7) int required",
"q" => [
"q1" => "numrange(5,8) int required",
],
];
$input = [
"p" => 0,
"q" => ["q1" => 6],
];

//test
fnvalidate($filter, $input);

?>

validate的更多相关文章

  1. Leetcode 笔记 98 - Validate Binary Search Tree

    题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...

  2. jQuery Validate 表单验证 — 用户注册简单应用

    相信很多coder在表单验证这块都是自己写验证规则的,今天我们用jQuery Validate这款前端验证利器来写一个简单的应用. 可以先把我写的这个小demo运行试下,先睹为快.猛戳链接--> ...

  3. jquery validate表单验证插件-推荐

    1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家.     1.点击表单项,显示帮助提示 2.鼠标离开表单项时,开始校验元素  3.鼠标离开后的正确.错误提示及鼠标移入时的帮 ...

  4. jq.validate隐藏元素忽略验证

    jq.validate隐藏元素忽略验证 现在有这样一个需求,当触发某类事件时候,需要在页面中显示input框,但是当不需要加载页面中的元素时候,进行隐藏.在这个需求的前提下,程序中对于input中的输 ...

  5. jq.validate 自定义验证两个日期

    jq.validate 自定义验证两个日期 首先定义有一个表单,date1和date2是属于表单的元素,若date1大于date2,返回false:若date1<date2,返回true.使用j ...

  6. 修改 jquery.validate.js 支持非form标签

    尝试使用markdown来写一篇blog,啦啦啦 源代码传送门:github 在特殊情况下我们使用jquery.validate.js对用户输入的内容做验证的时候,表单并不是一定包含在form之中,有 ...

  7. 表单验证插件之jquery.validate.js

    提到表单验证的插件,第一个想到的就是jquery.validate.js,所以小生想在这里稍微详细地说一下这款插件的具体使用方法,便于理解,我直接附上整段demo的代码(没怎么调样式,主要是看js): ...

  8. validate表单验证插件

    1.引入validate.js包 <script src="xx/xx/jquery.validate.min.js"></script> 2.表单验证 / ...

  9. 基于jQuery的Validate表单验证

    表单验证可以说在前端开发工作中是无处不在的~ 有数据,有登录,有表单, 都需要前端验证~~  而我工作中用到最多的就是基于基于jQuery的Validate表单验证~  就向下面这样~ 因为今天有个朋 ...

  10. Jquery客户端校验——jquery.validate.js

    jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证 ...

随机推荐

  1. CSRF攻击原理以及防御

    一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...

  2. Android系统架构-----Android的系统体系架构

    一.Android的系统体系结构 在入门了一个简单的Android的Hello World以后,我们首先来看一下我们Android的整体系统架构图: 这个就是我们Android的整体系统架构图了,我们 ...

  3. zabbix3.0.4 部署之六 (zabbix3.0.4安装)

    1. 新建zabbix用户,新建mysql zabbix数据库,并授权. groupadd zabbix #创建用户组zabbix useradd zabbix -g zabbix -s /bin/f ...

  4. Windows 10:解决开机显示C:\WINDOWS\system32\config\systemprofile\Desktop不可用的方法

      开机显示C:\WINDOWS\system32\config\systemprofile\Desktop不可用应该是不少网友都遇到过. 近日在使用Windows 10 Build 9926中,也出 ...

  5. 饮水思源——python中常用基础类源码解析

    1.bool类 2.int类 3.long类 4.float类 5.str类 6.list类 7.tuple类 8.dict类 9.collections类 Counter类:为hashable对象计 ...

  6. PowerDesigner导出建表sql脚本

    1 按照数据库类型,切换数据库. Database-> Change Current DBMS... 2.设置保存路径和文件名称

  7. css知识点积累

    关于样式的优先级问题: !important > style > [ id > class > tag ];  z-index 的属性用法: z-index属性是用来设置元素的 ...

  8. C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)

    C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...

  9. iOS开发UI篇—Quartz2D使用(图片剪切)

    iOS开发UI篇—Quartz2D使用(图片剪切) 一.使用Quartz2D完成图片剪切 1.把图片显示在自定义的view中 先把图片绘制到view上.按照原始大小,把图片绘制到一个点上. 代码: - ...

  10. 笔记本设置wifi热点

    http://jingyan.baidu.com/article/335530da4f774019cb41c3eb.html 注意: 1. 适配器设置中是设置的“本地连接”的属性,不要搞错了. 2. ...