簡體   English   中英

filter_var與preg_match

[英]filter_var versus preg_match

大家早

我正在轉換一個我正在努力的網站以符合最新版本的PHP,因此我將使用非折舊等價物替換所有ereg實例。 然而,有人告訴我一個方便的內置函數PHP,名為filter_var。

我的問題是,在filter_var上使用preg_match是否有意義? 因為選擇一個而不是另一個有性能提升或任何其他好處,如果是這樣,它們是什么?

首先 ,關於過濾的PHP手冊頁面: https//php.net/manual/en/book.filter.php

其次 ,背景是關鍵。 一般來說,過濾器功能設計為使用外部輸入 (標量或數組)或內部輸入 外部輸入來自HTTP請求/ PHP引擎或表單提交等來源。

使用filter_input前綴的過濾器函數允許您完全繞過 $ _SERVER,$ _COOKIE,$ _POST和$ _GET superglobals。 雖然您通常會指定數據來自“where”,但過濾器函數並未明確使用 $ _POST,$ _GET,$ _COOKIE和$ _SERVER。 您對變量/數組元素所做的更改不會顯示在$ _GET,$ _POST或$ _SERVER中,因此以這種方式使用過濾器是一種范例轉換,可能會顯着改變應用程序的流量。 換句話說,您必須自己跟蹤外部輸入。 我這樣做是為了對外部輸入進行初始消毒(剝離,替換,改變等)。 我根本不再使用$ _POST,$ _GET或$ _SERVER。 雖然,我仍然使用$ _FILES。

filter_var為前綴的函數用於過濾程序中已存在的任何常規數組。 我在使用filter_input后使用它。 在這兩種情況下都可以使用許多過濾器,但您的問題與性能有關。

如果您選擇將FILTER_VALIDATE_REGEXP過濾器與任何過濾函數一起使用,我無法想象這種間接方法比直接使用preg_match()更有效。 就其他過濾器而言,如果它們只是從正則表達式調用中刪除了許多方法/函數,那么我也看不到效率的提高

我認為過濾器功能是為了幫助提高在許多應用程序中發生的過濾任務的一致性而設計的。 它們可能不是為了提高效率而設計的,但它們的設計絕對比正則表達式更易於訪問 (盡管我對正則表達式非常熟悉)。 我更喜歡直接了解正在發生的事情,但有些人卻不關心或不關心。 但是,過濾器函數為那些不了解正則表達式和其他基本Web應用程序安全過程的人打開過濾字符串的大門。

但是,當然可以不使用過濾功能。

更重要的是,我將過濾器功能與我自己的清潔劑和驗證器類結合使用。 所以,我不是要求PHP為我思考,我只是用它來增強我已經知道的怎么做(以防萬一他們的功能得到了我想念的東西)。 防御深度。

總之,您最好的選擇就是使用preg_match() ,除非您打算將輸入的flowfilter_input函數) 更改為您的應用程序。 即使這樣,也不會有性能提升,但你可以繞過$ _SERVER,$ _POST和$ _GET。 此外,您可以利用更簡單,結構化,一致的過濾功能,並能夠使用回調函數( FILTER_CALLBACK )來調用自定義,內部,方法/函數(我也這樣做)。 此外,您仍然可以使用FILTER_VALIDATE_REGEXP過濾器將自己的正則表達式與過濾器函數一起使用,但同樣,我認為沒有理由相信如果您這樣做,應用程序的性能將會提高。 可維護性? 也許。 這取決於編寫代碼的人。

filter_var - 使用指定的過濾器過濾變量
preg_match - 執行正則表達式匹配

我想use可以使用filter_var來過濾變量但是作為preg_match的替代我不認為從ereg升級是個好主意,因為filter_var不使用正則表達式而你必須重寫很多功能/邏輯來做這個。

切換到使用filter_var()實際上是一個好主意。 您將無法使用現有的正則表達式,但是您可以完全消除它們。 通常,我們在應用程序中使用的正則表達式僅用於簡單驗證和過濾,這正是filter_var()函數的用途。

例如,在您的代碼中,您可能已經擁有:

if (eregi('\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b', $_POST['email'])) {
    echo "valid";
}

這可以被更漂亮的版本所取代(不依賴於自定義正則表達式):

if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    echo "valid";
}

filter_var()函數還能夠清理您正在檢查的特定數據不需要的字符,並返回已清理的字符串(而不是布爾值):

$clean = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);

filter_var()這種用法將取代ereg_replace()類型函數。

但是,對於最簡單的升級,您可以使用'p'為ereg *()系列函數添加“前綴”,這使得它們符合PCRE(因此不再在PHP 5.3+中棄用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM