Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】FILTER_VALIDATE_REGEXP定数の使い方

FILTER_VALIDATE_REGEXP定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

FILTER_VALIDATE_REGEXP定数は、指定された文字列が正規表現にマッチするかどうかを検証するためのフィルターを表す定数です。この定数は、主にPHPのフィルター関数であるfilter_var()filter_input()などと組み合わせて使用されます。ウェブアプリケーション開発において、ユーザーからの入力データが特定のパターンや形式に適合しているかをチェックする際に非常に重要な役割を果たします。

例えば、フォームに入力されたメールアドレスが正しい形式であるか、ユーザー名が半角英数字のみで構成されているか、または特定の文字数範囲内であるかといった、開発者が定義した複雑なルールに合致するかどうかを検証できます。この定数を使用することで、開発者は任意の正規表現パターンを適用し、そのパターンに合致しない入力データを自動的に無効として処理することが可能です。

不適切な入力データは、アプリケーションのセキュリティ上の脆弱性(例えば、SQLインジェクションやクロスサイトスクリプティングなど)を引き起こしたり、予期せぬエラーの原因となったりする可能性があるため、入力検証は堅牢なアプリケーションを構築する上で不可欠です。FILTER_VALIDATE_REGEXP定数は、そのようなリスクを軽減し、より安全で信頼性の高いデータ処理を実現するための強力なツールとなります。正規表現の知識が必要となりますが、これにより非常に柔軟な入力チェックを実装できるようになります。

構文(syntax)

1<?php
2$value_to_validate = "hello_world";
3$regexp_pattern = "/^[a-z_]+$/"; // 例:小文字アルファベットとアンダースコアのみを許可
4
5$validation_result = filter_var(
6    $value_to_validate,
7    FILTER_VALIDATE_REGEXP,
8    ['options' => ['regexp' => $regexp_pattern]]
9);
10?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHPのfilter_inputFILTER_VALIDATE_REGEXPで入力検証する

1<?php
2
3/**
4 * GETパラメータからユーザー名を取得し、正規表現で検証する関数。
5 * システムエンジニアを目指す初心者向けに、filter_inputとFILTER_VALIDATE_REGEXPの使用例を示します。
6 *
7 * 実行例:
8 * - 有効な場合: http://localhost/your_script.php?username=validUser123
9 * - 無効な場合: http://localhost/your_script.php?username=invalid!
10 * - パラメータがない場合: http://localhost/your_script.php
11 */
12function validateUsernameWithRegexp(): void
13{
14    // 'username'というGETパラメータの値を正規表現で検証します。
15    // FILTER_VALIDATE_REGEXP をフィルターとして指定し、
16    // 'options'配列で'regexp'キーに検証したい正規表現パターンを設定します。
17    // この例では、アルファベットと数字のみを3文字以上15文字以下で許可しています。
18    $username = filter_input(INPUT_GET, 'username', FILTER_VALIDATE_REGEXP, [
19        'options' => [
20            'regexp' => '/^[a-zA-Z0-9]{3,15}$/'
21        ]
22    ]);
23
24    // 検証結果の確認と出力
25    // filter_inputは検証に成功した場合、フィルタリングされた値を返します。
26    // 検証に失敗した場合 (形式が不正な場合)、またはパラメータが存在しない場合は false または null を返します。
27    if ($username === false || $username === null) {
28        echo "ユーザー名が無効です。英数字3~15文字で入力してください。<br>";
29        echo "例: http://localhost/your_script.php?username=TestUser123";
30    } else {
31        // 検証が成功した場合、安全に表示するためにHTMLエスケープします。
32        echo "ユーザー名: " . htmlspecialchars($username) . " は有効です。";
33    }
34}
35
36// 関数を実行して、検証処理を開始します。
37validateUsernameWithRegexp();

PHP 8において、ウェブアプリケーションでユーザーからの入力を安全に扱うことは非常に重要です。このサンプルコードは、GETパラメータとして渡されるユーザー名を、filter_input関数とFILTER_VALIDATE_REGEXP定数を用いて正規表現パターンに基づいて検証する方法を示しています。

filter_input関数は、GETやPOSTなどのユーザー入力を直接参照する代わりに、指定された入力タイプ(INPUT_GETでGETパラメータ)とパラメータ名('username')から値を取得し、同時に様々なフィルタリングや検証を適用できる安全な関数です。

ここで登場するFILTER_VALIDATE_REGEXPは、filter_input関数の第三引数として指定される定数です。この定数を指定することで、入力値を「正規表現パターンに合致するかどうか」という基準で検証するよう指示します。具体的な正規表現パターン自体は、filter_input関数の第四引数として渡されるオプション配列の中で、'regexp'キーに'/^[a-zA-Z0-9]{3,15}$/'のように設定します。このパターンは、入力が英数字のみで構成され、かつ3文字以上15文字以下であることを要求しています。

filter_input関数の戻り値は、検証に成功した場合はフィルタリングされた値(この例では検証済みのユーザー名)を返します。入力値が正規表現パターンに合致しない場合はfalseを、指定されたパラメータ自体が存在しない場合はnullを返します。したがって、コードでは$username === false || $username === nullという条件で、ユーザー名が無効であるか、入力がなかった場合を判断し、適切なエラーメッセージを表示します。検証が成功した場合は、セキュリティのためにhtmlspecialchars関数でエスケープ処理を施してからユーザー名を表示しています。

このサンプルコードは、ユーザーが入力するGETパラメータを正規表現で検証し、セキュリティを向上させる方法を示しています。FILTER_VALIDATE_REGEXPは単体では使えず、filter_inputなどの関数と組み合わせて利用し、options配列のregexpキーで正規表現パターンを指定する必要がある点に注意してください。

特に注意すべきは、filter_inputの戻り値です。検証に成功した場合はフィルタリングされた値が返りますが、形式が不正な場合はfalse、パラメータ自体が存在しない場合はnullが返されます。これらfalsenullのどちらも適切にエラー処理を行うようにしてください。

また、検証を通過した値であっても、ウェブページに表示する際はhtmlspecialchars()などで必ずHTMLエスケープし、クロスサイトスクリプティング(XSS)攻撃を防ぐことが重要です。ユーザーからの入力は常に信頼せず、検証とサニタイズを徹底する習慣を身につけましょう。

PHP filter_varで正規表現検証する

1<?php
2
3/**
4 * 指定された文字列が特定の正規表現パターンにマッチするかを検証します。
5 *
6 * FILTER_VALIDATE_REGEXP 定数は、filter_var() 関数と組み合わせて使用し、
7 * 入力値が指定された正規表現に適合するかどうかをチェックするために利用されます。
8 *
9 * @param string $input 検証する文字列。
10 * @param string $regexPattern 使用する正規表現パターン(例: '/^[a-zA-Z0-9_]+$/')。
11 * @return string|false 検証に成功した場合は入力文字列自体、失敗した場合は false を返します。
12 */
13function validateInputWithRegex(string $input, string $regexPattern): string|false
14{
15    // filter_var() 関数は、変数をフィルタリングします。
16    // 第二引数に FILTER_VALIDATE_REGEXP を指定することで、
17    // 入力が正規表現にマッチするかどうかを検証するよう指示します。
18    // 第三引数のオプション配列で、使用する正規表現パターンを 'regexp' キーで指定します。
19    $filteredValue = filter_var(
20        $input,
21        FILTER_VALIDATE_REGEXP,
22        [
23            'options' => [
24                'regexp' => $regexPattern
25            ]
26        ]
27    );
28
29    return $filteredValue;
30}
31
32// --- サンプルコードの実行例 ---
33
34echo "--- FILTER_VALIDATE_REGEXP の使用例 ---\n\n";
35
36// 例1: ユーザー名の検証 (英数字とアンダースコアのみを許可)
37$usernameRegex = '/^[a-zA-Z0-9_]{3,16}$/'; // 3文字から16文字の英数字とアンダースコア
38
39$testUsernames = [
40    "valid_user123",
41    "anotherUser",
42    "short", // 有効
43    "too_long_username_test", // 長すぎる
44    "user-name",  // ハイフンは無効
45    "user name",  // スペースは無効
46    "123", // 数字のみも有効
47];
48
49echo "== ユーザー名検証 ({$usernameRegex}) ==\n";
50foreach ($testUsernames as $username) {
51    $result = validateInputWithRegex($username, $usernameRegex);
52    if ($result !== false) {
53        echo "'{$username}' は有効なユーザー名です。\n";
54    } else {
55        echo "'{$username}' は無効なユーザー名です。\n";
56    }
57}
58echo "\n";
59
60// 例2: 数字のみの文字列検証 (郵便番号の一部など)
61$digitsRegex = '/^\d{5}$/'; // 厳密に5桁の数字
62
63$testDigits = [
64    "12345",
65    "98765",
66    "1234",  // 短すぎる
67    "123456", // 長すぎる
68    "abcde", // 数字ではない
69    "123a5", // 数字以外を含む
70];
71
72echo "== 5桁の数字検証 ({$digitsRegex}) ==\n";
73foreach ($testDigits as $digits) {
74    $result = validateInputWithRegex($digits, $digitsRegex);
75    if ($result !== false) {
76        echo "'{$digits}' は有効な5桁の数字です。\n";
77    } else {
78        echo "'{$digits}' は無効な5桁の数字です。\n";
79    }
80}
81echo "\n";
82
83?>

PHPのFILTER_VALIDATE_REGEXPは、入力された文字列が特定の正規表現パターンに適合するかどうかを検証するための定数です。この定数自体は引数や戻り値を持たず、主にfilter_var()関数と組み合わせて使用されます。

サンプルコードでは、validateInputWithRegexという関数を通じてFILTER_VALIDATE_REGEXPの具体的な使い方を示しています。この関数は検証したい文字列を第一引数$inputとして、使用する正規表現パターンを第二引数$regexPatternとして受け取ります。関数内部では、filter_var()関数にFILTER_VALIDATE_REGEXP定数と、オプションとして指定された正規表現パターンを渡し、入力値がパターンにマッチするかどうかをチェックします。

検証が成功し、入力文字列が正規表現に適合した場合は、その入力文字列自体が戻り値として返されます。一方、検証に失敗し、文字列が正規表現に適合しなかった場合は、falseが戻り値となります。

この機能は、例えばユーザー名が英数字とアンダースコアのみで構成されているか、または郵便番号のような文字列が厳密に5桁の数字であるかといった、入力値の形式を厳しくチェックする際に非常に役立ちます。これにより、プログラムが受け取るデータの形式を適切に制御し、アプリケーションの安全性と堅牢性を高めることができます。

FILTER_VALIDATE_REGEXPは、入力値が指定された正規表現パターンに合致するかを検証する際に使用します。最も重要な注意点は、使用する正規表現パターン自体を正しく記述することです。正規表現は非常に強力ですが、誤ったパターンは意図しない検証結果や、パフォーマンスの低下(ReDoS攻撃など)を引き起こす可能性があるため、慎重に設計し、必ずデリミタ(例:/^pattern$/のようにスラッシュ)で囲んでください。filter_var()関数は、検証に成功した場合に元の入力文字列を、失敗した場合は厳密にfalseを返します。そのため、結果を確認する際は=== falseまたは!== falseといった厳密な比較を用いることが重要です。これは主にユーザー入力の形式が正しいかを確認する「バリデーション」に利用され、セキュリティ向上に役立ちます。

関連コンテンツ