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

データ検証にはPHP独自のフィルタ機能を使用

WBOY
WBOYオリジナル
2016-06-23 13:33:431102ブラウズ

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

PHP フィルターには 2 つのタイプが含まれます
検証: 検証項目が合法かどうかを検証するために使用されます
サニタイズ: 検証された項目をフォーマットするために使用されるため、検証項目の値を変更し、不正な文字を削除する場合があります 削除など。
PHP公式ドキュメント参照: Filter function collection
参照元: http://www.lai18.com/doc/view/id/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
メールの検証
274
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
各フィルターには 1 つあります一意の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);?>

このときコードを実行すると、変数の出力がないことがわかりました。 これは、$in 変数が検証に合格していないためであり、このメソッドは bool を返します。 (偽)。同時に、$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' キーを含む配列を渡す必要があることがわかりました。上記のコードを実行すると、ページは表示されません。上記は検証が成功したことを示す
false
を返すため、このメソッドは負の数値の範囲検証を実行するためにも使用できます。このメソッドは単一の範囲値もサポートしています。つまり、次のような最大値または最小値の範囲を指定するだけです。上記のコードは、$int が $min より大きい (排他的に等しい) 整数型の値であるかどうかを検証します。コードを実行して出力 12
変数のセットを検証する


上記の例は、単一の値の単純な検証なので、変数のセットの場合はどうなるでしょうか? 答えは、filter_var_array() を使用することです。この関数は、複数の異なるタイプのデータを同時に検証できます。簡単な例を次に示します。

<?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)));?>

上記のコードを実行すると、出力は次のようになります。
<?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?>

8 進数と 16 進数


FILTER_VALIDATE_INT フィルターは両方をサポートします。 8 進数と 16 進数の 2 つのフラグは次のとおりです:
FILTER_FLAG_ALLOW_HEX
FILTER_FLAG_ALLOW_OCTAL

配列を使用してフラグを渡す
<?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 />';    }?>


ブール値検証 FILTER_VALIDATE_BOOLEAN


0 -- 101 -- 1092 -- 3 -- -12344 -- 5 -- 6 -- Array

フィルターが有効なブール値を見つけたので、上記のコードは 1 を出力します。 true を返すことができるものは以下にリストされています
1
“1”
“yes” "true" "on"
TRUE

以下の値は false を返します
0
"0"
"no"
" false"
"off"
""
NULL
FALSE

以下の使用法もサポートしています

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

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

配列を渡して、配列内の値のブール型を決定することもできます

<?php    /*** test for a boolean value ***/    echo filter_var("true", FILTER_VALIDATE_BOOLEAN);    //1?>

上面代码输出如下:

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)    }}

浮点型验证 FILTER_VALIDATE_FLOAT

<?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";    }?>

对数组进行浮点型验证

同其它验证一样,也可以对一个数组进行浮点型验证。与boolean验证类似,提供一个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 = "someone@exa 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!





声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。