filter_var是在php5.2.0中开始提供的。详细说明见:
<a href="http://www.php.net/manual/zh/book.filter.php" target="_blank">http://www.php.net/manual/zh/book.filter.php</a>
先看看代码:
<code><?php</code>
<code>class</code> <code>Utils {</code>
<code> </code><code>/**</code>
<code> </code><code>* 主要是调用filter_var_array验证,再扩充一个required字段来表示必填项。</code>
<code> </code><code>* http://www.php.net/manual/zh/book.filter.php</code>
<code> </code><code>* 注意: (可以不传,但不能传错)</code>
<code> </code><code>* 1.先验证格式,有失败的抛异常。</code>
<code> </code><code>* 2.未传的参数,有default的(不管是否required=1),则设置为default值。</code>
<code> </code><code>* 示例:</code>
<code> </code><code>* $filterArr = array(</code>
<code> </code><code>* "pn" =>array(</code>
<code> </code><code>* "required" => 1,</code>
<code> </code><code>* "filter" => FILTER_VALIDATE_INT,</code>
<code> </code><code>* "options" => array(</code>
<code> </code><code>* "default" =>1,</code>
<code> </code><code>* "min_range" =>1,</code>
<code> </code><code>* )</code>
<code> </code><code>* )</code>
<code> </code><code>* )</code>
<code> </code><code>*/</code>
<code>public</code> <code>static</code> <code>function</code> <code>filter_param(</code><code>$paramArr</code><code>, </code><code>$filterArr</code><code>){</code>
<code> </code><code>$res</code> <code>= filter_var_array(</code><code>$paramArr</code><code>, </code><code>$filterArr</code><code>); </code><code>//参数不合法-flase, 没传参数-null</code>
<code> </code><code>foreach</code><code>(</code><code>$res</code> <code>as</code> <code>$key</code><code>=></code><code>$val</code><code>){</code>
<code> </code><code>//如果有验证失败的,抛出异常。</code>
<code> </code><code>if</code><code>(false === </code><code>$val</code><code>){</code>
<code> </code><code>throw</code> <code>new</code> <code>Exception( </code><code>"Utils::filter_param: failed, key=$key "</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>//再判断未传的参数。</code>
<code> </code><code>if</code><code>( </code><code>is_null</code><code>(</code><code>$val</code><code>)){</code>
<code> </code><code>//1.如果是必填项</code>
<code> </code><code>if</code><code>(</code><code>$filterArr</code><code>[</code><code>$key</code><code>][</code><code>'required'</code><code>] ){</code>
<code> </code><code>if</code><code>(isset(</code><code>$filterArr</code><code>[</code><code>$key</code><code>][</code><code>'options'</code><code>][</code><code>'default'</code><code>])){</code>
<code> </code><code>//1.1如果有default值,则设置为default值。</code>
<code> </code><code>$res</code><code>[</code><code>$key</code><code>] = </code><code>$filterArr</code><code>[</code><code>$key</code><code>][</code><code>'options'</code><code>][</code><code>'default'</code><code>];</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>//1.2如果没有default值,抛出异常。</code>
<code> </code><code>throw</code> <code>new</code> <code>Exception( </code><code>"Utils::filter_param: Do not have required param, key=$key"</code> <code>);</code>
<code> </code><code>}</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>//$res[$key]=''; //这里是默认把null值改为空值。是否有必要?</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>return</code> <code>$res</code><code>;</code>
<code>}</code>
<code>};</code>
<code> </code><code>//每个model里,都写个checkParam函数,用来配置验证的规则。</code>
<code> </code><code>function</code> <code>checkParam(</code><code>$arrInput</code><code>){</code>
<code> </code><code>//1.先检查catId</code>
<code> </code><code>$filter</code> <code>= </code><code>array</code><code>(</code>
<code> </code><code>//数字类型的,必填。只允许 0-1。</code>
<code> </code><code>"catId"</code> <code>=> </code><code>array</code><code>(</code>
<code> </code><code>"required"</code><code>=>1,</code>
<code> </code><code>"filter"</code><code>=>FILTER_VALIDATE_INT,</code>
<code> </code><code>"options"</code><code>=></code><code>array</code><code>(</code>
<code> </code><code>"min_range"</code> <code>=>0,</code>
<code> </code><code>"max_range"</code> <code>=>1,</code>
<code> </code><code>)</code>
<code> </code><code>),</code>
<code> </code><code>//字符串类型的,必填。长度大于1。</code>
<code> </code><code>"title"</code> <code>=> </code><code>array</code><code>(</code>
<code> </code><code>"filter"</code><code>=>FILTER_VALIDATE_REGEXP,</code>
<code> </code><code>"regexp"</code> <code>=></code><code>"/^.+/"</code><code>,</code>
<code> </code><code>//字符串类型的,非必填。但要是填了的话,则格式必须为email。</code>
<code> </code><code>"email"</code> <code>=> </code><code>array</code><code>(</code>
<code> </code><code>"filter"</code><code>=>FILTER_VALIDATE_EMAIL,</code>
<code> </code><code>);</code>
<code> </code><code>$_res</code> <code>= Utils::filter_param(</code><code>$arrInput</code><code>, </code><code>$filter</code><code>) ;</code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>//比如这个是输入的参数。可以试着修改这里看看效果。</code>
<code> </code><code>$arrInput</code><code>=</code><code>array</code><code>(</code>
<code> </code><code>'catId'</code><code>=>1,</code>
<code> </code><code>'title'</code><code>=></code><code>'xx'</code><code>,</code>
<code> </code><code>'email'</code><code>=></code><code>'xxxxxx.com'</code><code>,</code>
<code> </code><code>);</code>
<code> </code><code>try</code><code>{</code>
<code> </code><code>$res</code><code>=checkParam(</code><code>$arrInput</code><code>);</code>
<code> </code><code>echo</code> <code>"验证通过,继续其它代码...\n"</code><code>;</code>
<code> </code><code>}</code><code>catch</code><code>(Exception </code><code>$e</code><code>){</code>
<code> </code><code>echo</code> <code>'Caught exception: '</code><code>, </code><code>$e</code><code>->getMessage(), </code><code>"\n"</code><code>;</code>
<code>?></code>
上面的代码,可直接运行。
使用方法:
建议把filter_param放到公共函数库中。
建议在每个model里都有个checkParam函数,专门配置验证规则。
本文转自 xjtuhit 51CTO博客,原文链接:http://blog.51cto.com/51reboot/1427065