簡介
Filter,它的作用就和他的名字一樣——過濾。Filter內建了多個常用過濾器,根據過濾器功能的不同,可以分成淨化過濾器(Sanitization)和驗證過濾器(Validation)兩種。兩種的差別在於,淨化過濾器會把被過濾的變數中不符合規則的東西清除掉,返回清除後的內容;而驗證過濾器只是驗證的功能,並不會去改變變數的值,如果符合過濾器的規則,則返回變數內容,否則返回false;
安裝
Filter的安裝很簡單,如果是PHP5.2.0之後的版本,應該已經預設開啟了,可以通過phpinfo()來查看。如果5.2.0之前的版本,可以使用PECL來使用Filter
使用
使用filter來過濾或驗證資料很簡單,下面是一個簡單的例子
<?php$email1 = 'huanggy@example.org';$email2 = "example.org";$email3 = "(huanggy@example.org)";var_dump(filter_var($email1,FILTER_VALIDATE_EMAIL));var_dump(filter_var($email2,FILTER_VALIDATE_EMAIL));var_dump(filter_var($email3,FILTER_SANITIZE_EMAIL));?>
執行上面的例子,你可以知道,filter_var($var,$filter)函數是使用過濾器$filter來過濾變數$var,而透過結果來分析,FILTER_VALIDATE_EMAIL過濾器只是驗證變數$email是否負責過濾器規定的規則,符合要求則返回變數內容,不符合則返回false;而FILTER_SANIZE_EMAIL則是對變數的內容進行淨化,把不負責規則的內容都清除,然後返回清除後的結果。
options參數的使用
<?php$int = 10;var_dump(filter_var($int,FILTER_VALIDATE_INT)); # 輸出int(10)$options = array('options'=>array('min_range'=>15));var_dump(filter_var($int,FILTER_VALIDATE_INT,$options));#輸出bool(false)?>
同樣的整形變數10,在我第二個過濾器中加兩個配置參數,最小值為15,10不滿足這個條件,所以返回fasle
再看下面這個例子
<?php$int = '0xf';var_dump(filter_var($int,FILTER_VALIDATE_INT)); # 輸出bool(false)$options = array('options'=>array('min_range'=>15),'flags'=>FILTER_FLAG_ALLOW_HEX);var_dump(filter_var($int,FILTER_VALIDATE_INT,$options));#輸出int(15)?>
預設FILTER_VALIDATE_INT過濾認為'0xf'不是整形變數,但是加了FLAGS附件參數FILTER_FLAG_ALLOW_HEX進去,FILTER_FLAG_ALLOW_HEX參數是允許使用十六進位的意思,'0xf'轉化為十六進位等於15,符合規則,返回15
注意:$options參數是一個數組,包含兩個元素:選項options(數組)和標記flags。若是只有flags元素,則也可以直接傳遞而不用數組。
選項options為一數組。數組關鍵字必須為:選項名稱。比如FILTER_VALIDATE_INT中的選項名稱有min_range、max_range;FILTER_VALIDATE_FLOAT中的選項名稱有decimal,FILTER_VALIDATE_REGEXP中的選項名稱有regexp。數組值根據選項名稱由使用者定義。比如min_range表示最小值過濾。比如:$options = array('options'=>array('min_range'=>3));那麼小於3的數字將無法通過驗證。
執行個體:
<?php$options = array();$options['options']['min_range'] = 1;$options['options']['max_range'] = 10;$options['flags'] = FILTER_FLAG_ALLOW_OCTAL;filter_var(3, FILTER_VALIDATE_INT, $options);?>
執行個體
<?php$foo = '256';$bar = '0x100';var_dump(validate_int($foo)); // false, too largevar_dump(validate_int($bar)); // false, too largefunction validate_int($input){ return filter_var( $input, FILTER_VALIDATE_INT, // We must pass an associative array // to include the range check options. array( 'flags' => FILTER_FLAG_ALLOW_HEX, 'options' => array('min_range' => 1, 'max_range' => 0xff) ) );}?>
執行個體
<?phpecho "|asdf".chr(9).chr(128)."_123|";echo "\n";// "bitwise conjunction" means logic OR / bitwise |echo filter_var("|asdf".chr(9).chr(128)."_123\n|" ,FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);/*Results:|asdf �_123||asdf_123|*/?>
不得不說FILTER_VALIDATE_REGEXP 過濾器
如果系統內建的驗證過濾器無法滿足現實需要,我們可以通過FILTER_VALIDATE_REGEXP 過濾器來對資料進行驗證。
<?php//比如查詢關鍵字,要排除'、"、<、>、=字元,並限定關鍵字長度if(!filter_input(INPUT_GET,'keyword',FILTER_VALIDATE_REGEXP,array("options"=>array("regexp"=>"/^(^('|\"|<|>|=){1,30})/")))) exit('關鍵字不符合要求');else echo 'vaild';?>
PHP FILTER_CALLBACK 過濾器
定義和用法:FILTER_CALLBACK 過濾器使用使用者自訂函數對值進行過濾。這個過濾器為我們提供了對資料過濾的完全控制。
指定的函數必須存入名為 "options" 的關聯陣列中。
Name: "callback"
ID-number: 1024
提示和注釋
提示:您可以建立自己的函數,或者使用已有的 PHP 函數。
請參見下面的例子。
例子 1:調用自訂函數
<?phpfunction convertSpace($string){ return str_replace(" ", "_", $string);}$string = "Peter is a great guy!";echo filter_var($string, FILTER_CALLBACK,array("options"=>"convertSpace"));?>
輸出:Peter_is_a_great_guy!
例子 2:調用系統函數
<?php$string="Peter is a great guy!";echo filter_var($string, FILTER_CALLBACK,array("options"=>"strtoupper"));?>
輸出:PETER IS A GREAT GUY!
例子 3:調用類方法
<?phpclass MyFilter{ public function filter1($str){ return str_replace('9','6',$str); }}echo filter_var('wo9w9w9',FILTER_CALLBACK,array('options'=>array('MyFilter','filter1')));//調用類方法?>
通過這種方式,就可以自訂一個過濾規則,通過FILTER_CALLBACK過濾器來過濾了
過濾器資料查閱
請訪問以下地址查閱:
1、http://www.54chen.com/p/intro.filter.html
2、http://www.w3school.com.cn/php/php_ref_filter.asp
3、http://cn2.php.net/manual/en/book.filter.php
本文參考:
http://blog.csdn.net/huanggy001/article/details/6149478
http://www.jb51.net/article/24532.htm