前回記載していますが、PHPは性質上Webアプリケーションで利用されるため、様々な外部入力の影響を受けます。そのため言語自前で入力チェックを行う機能を有しており、PHP Filter関数と呼ばれるものがあります。
今回はfilter_var()関数のやや高度な使い方をまとめています。
PHP Filter 関数
PHP Filter関数は、外部入力の検証およびサニタイズするために使用され、ユーザー入力のチェックに用いられる機能があり、データ検証を簡単かつ迅速に行えるように設計されています。
filter_list()関数を使用して、PHPが言語として提供しているFilter拡張機能のリスト一覧を確認できます。
範囲内の整数を検証する
次の例では、filter_var()関数を使って、ある変数の型がintで、かつ1から200までの値であるかどうかを調べます。
<?php /* variable to check */ $target_num = 115; /* min value */ $min = 1; /* max value */ $max = 200; if (filter_var($target_num, FILTER_VALIDATE_INT, array("options" => array("min_range"=>$min, "max_range"=>$max))) === false) { var_dump("Variable value is not within the legal range"); } else { var_dump("Variable value is within the legal range"); } //string(40) "Variable value is within the legal range"
IPv6アドレスの検証
filter_var() 関数を使用して、変数$ipが有効なIPv6アドレスであるかどうかを調べます。
<?php // Variable to check $ip = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334"; // Validate ip as IPv6 if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) { var_dump("$ip is a valid IPv6 address"); } else { var_dump("$ip is not a valid IPv6 address"); } //string(63) "2001:0db8:85a3:08d3:1319:8a2e:0370:7334 is a valid IPv6 address"
URLの検証 - クエリ文字列が含まれているか
次の記述ではfilter_var()関数を使用して、変数 $url がクエリストリングを含むURLであるかどうか調べています。
<?php // Variable to check $url = "https://www.w3schools.com"; // Validate url if (!filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED) === false) { var_dump("$url is a valid URL with a query string"); } else { var_dump("$url is not a valid URL with a query string"); } // string(64) "https://www.w3schools.com is not a valid URL with a query string"
ASCII 値が127以上の文字の除去
filter_var()関数を使って文字列をサニタイズ出来ます。ASCIIは127が最後の値なので、この例では対象の文字列からHTMLタグすべてと、ASCII 値が 127 を超える文字を削除しています。
<?php // Variable to check $str = "<h1>Hello WorldÆØÅ!</h1>"; // Remove HTML tags and all characters with ASCII value > 127 $newstr = filter_var($str, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH); var_dump($newstr); // string(12) "Hello World!"