PHP歴20年を超える私ですが、最近、filter_var
関数というものを先日初めて知りました。
完全フリーランスで一人作業ということもあり、度々こういった「こんな初歩的なことを知らなかった」ということがあります。知識が偏りすぎですね(汗)
使えそうな関数かな!?と思い、自身の勉強も兼ねて、filter_var
関数について調べたことをまとめます。
filter_var()関数とは?
データをフィルタリングおよび検証するために使用する関数です。
スクリプトがユーザから送信されたデータを安全に扱えるように、または期待する形式と一致していることを確認するために使えます。
基本
filter_var
はPHP5.2以降で使用できます。結構前から使えたんですね……。
filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed
mixed $value
処理対象となる値。mixed
とあるように、いろんな型を入れられます。ただし、フィルタリングの処理がされる前に内部的に文字列へ変換されます。
int $filter
適用するフィルタ。定数で指定します。
array|int $options = 0
配列または数値型で、オプションを適用することができます。こちらも後述します。
戻り値: mixed
戻り値は、フィルタリングされたデータまたは、失敗した場合にfalseです。
filter_varの使用例
メールアドレスのバリデーション
以下の様に、簡単にバリデーションできます。
$email = "user@example.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo("Email is valid");
} else {
echo("Email is not valid");
}
個人的にはメールアドレスは正規表現でバリデーションしていましたが、こちらの方が良さそうです。
ただ、メールアドレスはRFC準拠していない以下の様なものは、エラーと見なすようです。まあ最近は少ないのだとは思いますが、その点は注意です。
// 以下は両方エラーになる
$email = "user.@example.com"; // アットマーク直前にドット
$email = "us..er@example.com"; // ドット2連続もエラー
URLのバリデーション
URLも簡単にバリデーションできます。
$url = "https://example.jp";
if(filter_var($url, FILTER_VALIDATE_URL)) {
echo "URL is valid.";
} else {
echo "URL is not valid.";
}
URLの判定も私は正規表現でやっていたのですが、こちらの方がシンプルですね。
配列をフィルタリングする例
<?php
$emails = [
"alice@example.jp",
"demo@example.com",
"incorrectmail"
];
var_dump(filter_var($emails, FILTER_VALIDATE_EMAIL, FILTER_REQUIRE_ARRAY));
出力結果
array(3) {
[0]=>
string(16) "alice@example.jp"
[1]=>
string(16) "demo@example.com"
[2]=>
bool(false)
}
この場合、メールアドレスにそぐわない項目がfalse
になっています。
配列をフィルタリングする例2
先ほどの例では、スマートではないかもしれません。有効なメールアドレスのみ欲しい……という場合を想定します。
以下のコードはarray_filter
関数を併用してその問題を解決しています。
<?php
$emails = [
"alice@example.jp",
"demo@example.com",
"incorrectmail"
];
$filtered_emails = array_filter($emails, function($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL);
});
var_dump($filtered_emails);
出力結果
array(2) {
[0]=>
string(16) "alice@example.jp"
[1]=>
string(16) "demo@example.com"
}
array_filter
関数の第二引数にはコールバック関数が指定され、これが配列の各要素に適用されます。ここでは、コールバック関数として無名関数(ラムダ)を指定し、その中でfilter_var
関数を使用してメールアドレスの形式をチェックします。
このコードを実行すると、有効なメールアドレスだけが含まれた新しい配列が表示されます。こちらの方が実用的かもしれませんね。
数値の0~9かを調べる
<?php
$number = 5;
if (!filter_var($number, FILTER_VALIDATE_INT, array("options" => array("min_range" => 0, "max_range" => 9)))) {
echo "Number is not within the valid range!";
} else {
echo "Number is within the valid range!";
}
111を’111’にする
<?php
$number = 111;
$filtered_number = filter_var($number, FILTER_SANITIZE_NUMBER_INT);
var_dump($filtered_number);
// string(3) "111"
ちなみに’111’を111にするような逆はできないようです。
そもそも論ですが、こういった用途は普通にキャストした方が早そうです。
$var = '111';
$int_var = (int)$str;
$var = 111;
$str_var = (string)$var;
まとめ
フィルターなのか、バリデーションなのかよく分からない関数……という印象です。個人的には、覚えるコストを考えるとあまり使う気にならないところです。
URLやメールアドレスのバリデーションや、配列を処理する程度には覚えておこうと思います。
また、関連関数としてfilter_var_array
という、配列を処理する関数もあるようです。一緒くたに処理されるので、詳細なエラーメッセージを出したい場合には向かないかもしれませんが、こちらも今度調べてみます。
コメント