ゼロから始めるPHP講座Vol31 正規表現の使用例と演習


ゼロから始めるPHP講座Vol31 正規表現の使用例と演習
目次
  1. ゼロから始めるPHP講座正規表現の使用例と演習
  2. PHPにおける正規表現の使用例
  3. 課題

ゼロから始めるPHP講座正規表現の使用例と演習

PHPにおける正規表現の使用例

正規表現は様々な使い道がありますが、PHPで最もよく使われる例として、ユーザが入力した情報のチェックがあります。

php-regular_expression-2-1-639

このようなページでは、ユーザが入力した値が正しい形式で入力されているか、チェックを行うのが一般的です。(指定した形式以外を入力した場合にはエラーメッセージが表示される)

例えば携帯電話番号の場合、php-regular_expression-2-2-639

このチェックを行うために、正規表現を利用します。

携帯電話番号を正規表現で表すと、以下のようになります。(書き方は複数あります)

先頭から3桁の数字、ハイフン、4桁の数字、ハイフン、4桁の数字が末尾php-regular_expression-2-3-639


<?php

$message = NULL;

if (isset($_POST['phone_number']) === TRUE) {

    $phone_number = $_POST['phone_number'];

    if (mb_strlen($phone_number) === 0) {
        $message =  '携帯電話番号を入力してください。';
    } else if (preg_match('/^[0-9]{3}-[0-9]{4}-[0-9]{4}$/', $phone_number) !== 1) {
        $message = '形式が違います。xxx-xxxx-xxxxの形式の数値で入力してください';
    } else {
        $message = 'あなたの携帯電話番号は「' . htmlspecialchars($phone_number, ENT_QUOTES, 'UTF-8') . '」です';
    }
}

?>
<!DOCTYPE HTML>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>正規表現</title>
</head>
<body>
<form method="post">
    <label for="phone_number">携帯電話番号(xxx-xxxx-xxxx):</label>
    <input id="phone_number" type="text" name="phone_number" value="<?php if (isset($phone_number) === TRUE) { print $phone_number; }?>">
    <input type="submit" value="送信">
</form>
<?php if ($message !== NULL) { ?>
    <p><?php print $message;?></p>
<?php } ?>
</body>
</html>

php-regular_expression-2-4-639

php-regular_expression-2-5-639

php-regular_expression-2-5.1-639

php-regular_expression-2-6-639

実際にPHPマニュアルでpreg_match関数の返り値について解説しているページを確認すると、返り値は「===」で調べるよう警告文が記載されています。preg_match()

関数の機能や返り値を全て覚える必要はなく、必要なときにPHPマニュアルで調べるで十分ですが、preg_match関数はよく使いますので、是非覚えておきましょう。

課題

以下の例を表す正規表現を作成してください。

作成した正規表現は、こちらで用意した確認用プログラムの指定箇所に入力した上でファイルを保存し、URLへアクセした際、結果が全て「完全一致」と表示されることを確認してください。

ファイル名:challenge_preg_match.php


<?php

// 西暦
$regexp_year   = '//'; // 西暦の正規表現を入力
$check_year[0] = '1953';
$check_year[1] = '2013';

// 電話番号
$regexp_phone_number   = '//'; // 電話番号の正規表現を入力
$check_phone_number[0] = '03-1111-1111';
$check_phone_number[1] = '040-222-2222';
$check_phone_number[2] = '0120-000-000';

// formタグ
$regexp_form   = '//'; // formの正規表現を入力
$check_form[0] = '<form>';
$check_form[1] = '<form method="post">';

// メールアドレス
$regexp_mail   = '//'; // メールアドレスの正規表現を入力
$check_mail[0] = 'test@test.com';
$check_mail[1] = 'test_2@test.co.jp';
$check_mail[2] = 'test.3@example.ne.jp';

// URL
$regexp_url   = '//'; // URLの正規表現を入力
$check_url[0] = 'http://codecamp.jp';
$check_url[1] = 'https://test.com';
$check_url[2] = 'http://codecamp.jp/index.html?q=test';

////////////////////////////////////////////////////////
// これ以降の処理はソースコード変更を行わないようにしてください。
////////////////////////////////////////////////////////
$reslut_check_phone_number = check_regexp($regexp_phone_number, $check_phone_number);
$reslut_check_form         = check_regexp($regexp_form, $check_form);
$reslut_check_mail         = check_regexp($regexp_mail, $check_mail);
$reslut_check_year         = check_regexp($regexp_year, $check_year);
$reslut_check_url          = check_regexp($regexp_url, $check_url);

function check_regexp($regexp, $str_data) {

    $msg = array();

    foreach ($str_data as $value) {
        if (preg_match($regexp, $value, $macthes) === 1) {
            if ($value === $macthes[0]) {
                $msg[] =  '完全一致: ' . $value;
            } else {
                $msg[] =  '部分一致: ' . $value . ' 【一致した文字列: ' . $macthes[0] . '】';
            }
        } else {
            $msg[] = '不一致: ' . $value;
        }
    }
    return $msg;
}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>正規表現課題</title>
    <style type="text/css">
        h1 {
            font-size: 16px;
        }

        h1, p {
            margin: 0px;
        }
    </style>
</head>
<body>
    <section>
        <h1>西暦の正規表現チェック: <?php print htmlspecialchars($regexp_year, ENT_QUOTES, 'UTF-8'); ?></h1>
<?php foreach ($reslut_check_year as $value) { ?>
        <p><?php print htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); ?></p>
<?php } ?>
    </section>
    <section>
        <h1>電話番号の正規表現チェック: <?php print htmlspecialchars($regexp_phone_number, ENT_QUOTES, 'UTF-8'); ?></h1>
<?php foreach ($reslut_check_phone_number as $value) { ?>
        <p><?php print htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); ?></p>
<?php } ?>
    </section>
    <section>
        <h1>fromタグの正規表現チェック: <?php print htmlspecialchars($regexp_form, ENT_QUOTES, 'UTF-8'); ?></h1>
<?php foreach ($reslut_check_form as $value) { ?>
        <p><?php print htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); ?></p>
<?php } ?>
    </section>
    <section>
        <h1>メールアドレスの正規表現チェック: <?php print htmlspecialchars($regexp_mail, ENT_QUOTES, 'UTF-8'); ?></h1>
<?php foreach ($reslut_check_mail as $value) { ?>
        <p><?php print htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); ?></p>
<?php } ?>
    </section>
    <section>
        <h1>URLの正規表現チェック: <?php print htmlspecialchars($regexp_url, ENT_QUOTES, 'UTF-8'); ?></h1>
<?php foreach ($reslut_check_url as $value) { ?>
        <p><?php print htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); ?></p>
<?php } ?>
    </section>
</body>
</html>

可能ならば、メールアドレスとURLにはどんな記号が利用可能なのか調べ、例として挙げたもの以外もできる限り正確にチェックが行える正規表現を作成してください。php-regular_expression-2-7-639

NEXTLESSONデータベースの設計正規化①データベースの設計正規化①

PREVLESSON正規表現とは正規表現とは


CodeCampus編集部
この記事を書いた人
CodeCampus編集部
まずは7日間お試し!人気プログラミング講座を無料公開中
オンライン・プログラミングレッスンNo.1のCodeCamp