PHP擴充套件之Filter詳解

2021-06-02 08:35:56 字數 4131 閱讀 2387

filter,它的作用就和他的名字一樣——過濾。filter內建了多個常用過濾器,根據過濾器功能的不同,可以分成淨化過濾器(sanitization)和驗證過濾器(validation)兩種。兩種的差別在於,淨化過濾器會把被過濾的變數中不符合規則的東西清除掉,返回清除後的內容;而驗證過濾器只是驗證的功能,並不會去改變變數的值,如果符合過濾器的規則,則返回變數內容,否則返回false;

filter的安裝很簡單,如果是php5.2.0之後的版本,應該已經預設開啟了,可以通過phpinfo()來檢視。如果5.2.0之前的版本,可以使用pecl來使用filter

使用filter來過濾或驗證資料很簡單,下面是乙個簡單的例子

<?php

$email1 = '[email protected]';

$email2 = "example.org";

$email3 = "([email protected])";

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則是對變數的內容進行淨化,把不負責規則的內容都清除,然後返回清除後的結果。

<?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 large

var_dump(validate_int($bar)); // false, too large

function validate_int($input)

?>

例項

<?php

echo "|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 過濾器來對資料進行驗證。

<?php

//比如查詢關鍵字,要排除'、"、<、>、=字元,並限定關鍵字長度

if(!filter_input(input_get,'keyword',filter_validate_regexp,array("options"=>array("regexp"=>"/^(^('|\"|<|>|=))/"))))

exit('關鍵字不符合要求');

else

echo 'vaild';

?>

定義和用法:filter_callback 過濾器使用使用者自定義函式對值進行過濾。這個過濾器為我們提供了對資料過濾的完全控制。

指定的函式必須存入名為 "options" 的關聯陣列中。

請參見下面的例子。

例子 1:呼叫自定義函式

<?php

function convertspace($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:呼叫類方法

<?php

class myfilter

}echo filter_var('wo9w9w9',filter_callback,array('options'=>array('myfilter','filter1')));//呼叫類方法

?>

通過這種方式,就可以自定義乙個過濾規則,通過filter_callback過濾器來過濾了

1、2、

3、

本文參考:

php的filter擴充套件小技巧

做為乙個合格的web開發人員,一定會牢記乙個原則 永遠不能相信使用者輸入的資料,行走江湖,安全第一是很重要的。使用者通過表單或url傳過來的資料,一定要仔細檢查過了,才往後臺資料庫裡存進去。在乙個成熟的開發團隊裡,貫徹這個原則不成問題 但是如果在乙個新人老手混搭的小team裡,很容易就忽視了這個問題...

Logstash詳解之 filter模組

logstash三個元件的第二個元件,也是真個logstash工具中最複雜,最蛋疼的乙個元件,當然,也是最有作用的乙個元件。1 grok外掛程式 grok外掛程式有非常強大的功能,他能匹配一切資料,但是他的效能和對資源的損耗同樣讓人詬病。filter 2 mutate外掛程式 mutate外掛程式是...

php的擴充套件php curl例項詳解

curl傳送請求的例項在網上搜尋,php的擴充套件php curl例項詳解類似的文章可以搜到很多,但是為什麼還要寫這篇呢,因為發現網上大多在頁面上的排版都挺亂的,看起來比較吃力,例項 也不整齊,所以乾脆重新測試重新編寫 吧,就當是備忘錄吧。一 平時我們傳送請求採用的方式 一般使用如下的方式 str ...