ホームページ > バックエンド開発 > PHPチュートリアル > PHP独自のフィルタ機能を利用してデータ検証を行う

PHP独自のフィルタ機能を利用してデータ検証を行う

WBOY
リリース: 2016-06-13 12:20:52
オリジナル
1069 人が閲覧しました

データ検証には PHP 独自のフィルタ関数を使用します

データ検証には PHP 独自のフィルタ関数を使用します

PHP フィルターには 2 つのタイプがあります
Validation: 検証項目が合法かどうかを検証するために使用されます
Sanitization: は検証のフォーマットに使用されます項目のため、検証項目の値を変更したり、不正な文字を削除したりする場合があります。
参考 PHP 公式ドキュメント: フィルター関数一覧
参考元: http://www.lai18.com/content/ 410997.html

input_filters_list()


は、現在のシステムでサポートされているすべてのフィルターをリストするために使用されます。

<?phpforeach(filter_list() as $id => $filter){    echo $filter.' '.filter_id($filter)."\n";}?>
ログイン後にコピー

上記のコードは次の情報を出力します
フィルター名
フィルター ID
int
257
boolean
258
float
259
validate_regexp
272
validate_url
273
validate_email
274
validate_ip
275
文字列
513
削除
513
エンコード
514
special_chars
515
full_special_chars
522
unsafe_raw
516
メール
517
url
518
number_int
519
number_float
520
magic_quotes
521
callback
1024
各フィルターには一意の ID があります。ここでの各フィルターは、filter_var() 関数で使用できます。以下にその使い方を一つずつ紹介していきます。上記の文字列と StrippedID が同じであることに注意してください。これは、これらが同じフィルターであるか、同じフィルターの単なる 2 つのエイリアスであるためです。

データをフィルタリングする

filter_var() メソッドを使用してデータをフィルタリングする例を次に示します。

<?php    /*** an integer to check ***/    $int = 1234;    /*** validate the integer ***/    echo filter_var($int, FILTER_VALIDATE_INT);    //1234?>
ログイン後にコピー

上記。 $int 変数は整数型の検証に合格しているため、コードのデータは整数型 1234 になります。この時点でコードを実行すると、$int 変数の内容が

<?php    /*** an integer to check ***/    $int = 'abc1234';    /*** validate the integer ***/    echo filter_var($int, FILTER_VALIDATE_INT);?>
ログイン後にコピー

に変更されます。今度は、Any 変数の出力がないことがわかりました。これは、$in 変数が検証に合格しないためで、このメソッドは bool(false) を返します。同時に、$int= であっても bool(false) が返されることに注意してください

整数検証

上記のいくつかのコード実際に、FILTER_VALIDATE_INT は、変数が整数であるかどうかを検証し、その値が 50 から 100<🎜 の範囲内であるかどうかを検証してみましょう。 >

<?php    /*** an integer to check ***/    $int = 42;    /*** lower limit of the int ***/    $min = 50;    /*** upper limit of the int ***/    $max = 100;    /*** validate the integer ***/    echo filter_var($int, FILTER_VALIDATE_INT, array("min_range" => $min, "max_range" => $max));    //42?>
ログイン後にコピー
上記のコードを実行すると、42 が出力され、エラーが見つからないことがわかります。これはなぜですか? 検証に追加の検証ルールを追加する場合は、パスする必要があることがわかります。 '
options.' キー配列を含むオプションは次のようになります:

<?php    /*** an integer to check ***/    $int = 42;    /*** lower limit of the int ***/    $min = 50;    /*** upper limit of the int ***/    $max = 100;    /*** validate the integer ***/    echo filter_var($int, FILTER_VALIDATE_INT, array("options" => array("min_range" => $min, "max_range" => $max)));?>
ログイン後にコピー
上記のコードは < を返すため、ページには何も出力されません。 🎜>false
、検証が成功したことを示します。このメソッドを使用すると、負の数値に対して範囲検証を実行することもできます。同時に、このメソッドは単一範囲の値もサポートします。つまり、最大値または最小値の範囲 (例:



) 上記のコードは、$int が $min より大きい (排他的に等しい) 整数型の値であるかどうかを検証し、コードを実行して出力します。 12
<?php    /*** an integer to check ***/    $int = 12;    /*** lower limit of the int ***/    $min = 10;    /*** validate the integer ***/    echo filter_var($int, FILTER_VALIDATE_INT,array('options' => array('min_range' => $min)));    //12?>
ログイン後にコピー


変数のセットを検証する
上記の例は単に単一の値を検証しているため、変数のセットを検証する場合はどうなるでしょうか? filter_var_array()。この関数は、複数の異なるタイプのデータを同時に検証できます。



上記のコードを実行すると、出力は次のようになります。 🎜>
<?php    /*** an array of values to filter ***/    $arr = array(10,"109","", "-1234", "some text", "asdf234asdfgs", array());    /*** create an array of filtered values ***/    $filtered_array = filter_var_array($arr, FILTER_VALIDATE_INT);    /*** print out the results ***/    foreach($filtered_array as $key => $value)    {        echo $key.' -- '.$value.'<br />';    }?>
ログイン後にコピー


8 進数と 16 進数
0 -- 101 -- 1092 -- 3 -- -12344 -- 5 -- 6 -- Array
ログイン後にコピー

FILTER_VALIDATE_INT フィルターは、8 進数と 16 進数の両方をサポートします: FILTER_FLAG_ALLOW_HEXFILTER_FLAG_ALLOW_OCTAL

配列を使用してフラグを渡します




ブール検証 FILTER_VALIDATE_BOOLEAN
<?php    /*** a hex value to check ***/    $hex = "0xff";    /*** filter with HEX flag ***/    echo filter_var($hex, FILTER_VALIDATE_INT, array("flags" => FILTER_FLAG_ALLOW_HEX));    //255?>
ログイン後にコピー

フィルターが有効な値を見つけたため、上記のコードは 1 を出力します。以下は、true 値を返すことができるその他の値のリストです。
1
「1」
<?php    /*** test for a boolean value ***/    echo filter_var("true", FILTER_VALIDATE_BOOLEAN);    //1?>
ログイン後にコピー
「yes」
「true」
「on」
TRUE

次の値は false を返します
0
「0」
「no」
「false」
「off」
「」
NULL
FALSE

次のような使い方もサポートしています



上記のコードでは、まず in_array 関数が正常に実行されたと判断して true を返すので、最後のコードはtrue

配列を渡して判断することもできます。配列内の値のブール型
<?php    /*** a simple array ***/    $array = array(1,2,3,4,5);    /*** test for a boolean value ***/    echo filter_var(in_array(3, $array), FILTER_VALIDATE_BOOLEAN) ? "TRUE" : "FALSE";    //true?>
ログイン後にコピー



上記のコードの出力は次のとおりです:

<?php    /*** a multi dimensional array ***/    $array = array(0, 1, 2, 3, 4, array(0, 1, 2, 3, 4));    /*** create the list of values ***/    $values = filter_var($array, FILTER_VALIDATE_BOOLEAN, FILTER_REQUIRE_ARRAY);    /*** dump the values ***/    var_dump($values);?>
ログイン後にコピー


浮動小数点型検証 FILTER_VALIDATE_FLOAT
array(6) {    [0] => bool(false)    [1] => bool(true)    [2] => bool(false)    [3] => bool(false)    [4] => bool(false)    [5] => array(5) {        [0] => bool(false)        [1] => bool(true)        [2] => bool(false)        [3] => bool(false)        [4] => bool(false)    }}
ログイン後にコピー


配列に対して浮動小数点検証を実行します
<?php    /*** an FLOAT value to check ***/    $float = 22.42;    /*** validate with the FLOAT flag ***/    if(filter_var($float, FILTER_VALIDATE_FLOAT) === false)    {        echo "$float is not valid!";    }    else    {        echo "$float is a valid floating point number";    }?>
ログイン後にコピー

他の検証と同様に、配列に対して浮動小数点検証を実行することもできます。ブール値検証と同様に、flgs FILTER_REQUIRE_ARRAY を指定します。

<?php    /*** an array of values ***/    $array = array(1.2,"1.7","", "-12345.678", "some text", "abcd4.2efgh", array());    /*** validate the array ***/    $validation_array = filter_var($array, FILTER_VALIDATE_FLOAT, FILTER_REQUIRE_ARRAY);    /*** dump the array of validated data ***/    var_dump($validation_array);?>
ログイン後にコピー

上面的代码输出如下

array(7) {    [0] => float(1.2)    [1] => float(1.7)    [2] => bool(false)    [3] => float(-23234.123)    [4] => bool(false)    [5] => bool(false)    [6] => array(0) { }}
ログイン後にコピー

浮点型过滤器支持我们指定一个数字间的分隔符

<?php    /*** an array of floats with seperators ***/    $floats = array(        "1,234" => ",",        "1.234" => "..",        "1.2e3" => ","    );    /*** validate the floats against the user defined decimal seperators ***/    foreach ($floats as $float => $dec_sep)    {        $out = filter_var($float, FILTER_VALIDATE_FLOAT, array("options" => array("decimal" => $dec_sep)));        /*** dump the results ***/        var_dump($out);    }?>
ログイン後にコピー

在上面的代码中,$floats函数中第一个元素值为’,’,所以在判断1,234值时为其指定了分隔符为’,’,所以返回true

上面代码完整返回值
float(1.234)Warning: filter_var() [function.filter-var]: decimal separator must be one char in /www/filter.php on line 13bool(false)bool(false)
ログイン後にコピー

验证URL FILTER_VALIDATE_URL

URL的验证是一项很困难的行为,由于URL的不确定性,它没有最大长度的限制,而且它的格式是多样化的,你可以通过阅读RFC 1738来了解有关URL的一些信息。之后你可以创建一个类来验证所有ipv4和ipv6的URL,以及一些其它URL的验证。你也可以简单的使用FILTER_VALIDATE_URL来验证URL。

<?php     /*** a rfc compliant web address ***/    $url = "http://www.phpro.org";    /*** try to validate the URL ***/    if(filter_var($url, FILTER_VALIDATE_URL) === FALSE)    {        /*** if there is no match ***/        echo "Sorry, $url is not valid!";    }    else    {        /*** if we match the pattern ***/        echo "The URL, $url is valid!<br />";    }?>
ログイン後にコピー

上面的例子中通过简单的if语句来判断给定的URL是否合法,但并不是所有的URL都是这样的格式。有时候URL可是能是一个IP地址,也可能在URL中传递了多个参数。下面提供了几个flags来帮助我们验证URL:
FILTER_FLAG_SCHEME_REQUIRED – 要求 URL 是 RFC 兼容 URL。(比如:http://cg.am)
FILTER_FLAG_HOST_REQUIRED – 要求 URL 包含主机名(比如:http://levi.cg.com)
FILTER_FLAG_PATH_REQUIRED – 要求 URL 在主机名后存在路径(比如:http://levi.cg.am/test/phpmailer/)
FILTER_FLAG_QUERY_REQUIRED – 要求 URL 存在查询字符串(比如:http://levi.cg.am/?p=2618)

<?php    /*** a non rfc compliant URL ***/    $url = "index.php";    /*** try to validate the URL ***/    if(filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED) === FALSE)    {        /*** if there is no match ***/        echo "Sorry, $url is not valid!";    }    else    {        /*** if the URL is valid ***/        echo "The URL, $url is valid!";    }?>
ログイン後にコピー

可以发现,上面的代码没有通过验证

IP过滤器 FILTER_VALIDATE_IP

FILTER_VALIDATE_IP 过滤器把值作为 IP 进行验证。

Name: “validate_ip”

ID-number: 275

可能的标志:

FILTER_FLAG_IPV4 – 要求值是合法的 IPv4 IP(比如:255.255.255.255)
FILTER_FLAG_IPV6 – 要求值是合法的 IPv6 IP(比如:2001:0db8:85a3:08d3:1319:8a2e:0370:7334)
FILTER_FLAG_NO_PRIV_RANGE – 要求值是 RFC 指定的私域 IP (比如 192.168.0.1)
FILTER_FLAG_NO_RES_RANGE – 要求值不在保留的 IP 范围内。该标志接受 IPV4 和 IPV6 值。

Email过滤器FILTER_VALIDATE_EMAIL

FILTER_VALIDATE_EMAIL 过滤器把值作为电子邮件地址来验证。

<?php    $email = "[email&#160;protected] mple.com";    if(!filter_var($email, FILTER_VALIDATE_EMAIL))    {        echo "E-mail is not valid";    }    else    {        echo "E-mail is valid";    }?>
ログイン後にコピー

自定义过滤器 FILTER_CALLBACK

FILTER_CALLBACK 过滤器使用用户自定义函数对值进行过滤。

这个过滤器为我们提供了对数据过滤的完全控制。

指定的函数必须存入名为 “options” 的关联数组中。

<?php    function 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!
ログイン後にコピー





1楼u0112524023小时前
thanks
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート