QA@IT

PHPの正規表現について

7125 PV

現在PHPを勉強中でして、正規表現の勉強をしております。
某教科書に記載されている、正規表現の問題が分からないので教えて欲しいです。
問題は以下の通りです。
以下の例を表す正規表現を作成してください。

1,電話番号 (例: 03-1111-1111, 040-222-2222)
2,西暦(例: 1953, 2003)
3,formタグ (例: , )
4,メールアドレス (例: test_2@test.co.jp, test.3@example.ne.jp)
5,URL(例: https://test.com, http://codecamp.jp/index.html?q=test)
作成した正規表現は、こちらで用意した確認用プログラムの指定箇所に入力した上でファイルを保存し、URLへアクセした際、結果が全て「完全一致」と表示されることを確認してください。

<?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にはどんな記号が利用可能なのか調べ、例として挙げたもの以外もできる限り正確にチェックが行える正規表現を作成してください。

76a581b3515c6c54fabd09daf099c580.png

正規表現とチェックする文字が全てマッチした場合は「完全一致」、一部だけマッチした場合は「部分一致」、マッチしなかった場合は「不一致」と表示されます。
※上記サンプルのURL正規表現のような「部分一致」は正解ではありません

ここまでが問題の内容となっております。

分からない点に関してなのですが、電話番号の正規表現の箇所では、

$regexp_phone_number   = '/^[0-9]{2}-[0-9]{4}-[0-9]{4}$/'; // 電話番号の正規表現を入力

と書いたのですが、これでは$check_phone_number[0] にしか該当しないということになりますよね...?
$check_phone_number[1]と$check_phone_number[2]にも該当させるためにはどうしたら良いのでしょうか?
その他の部分についても分からない状態です。特になのですが、formタグの正規表現の部分にかんしては、一致させる意味が分かりません。
電話番号、メールアドレス、URL、西暦などのユーザーが入力する為の値をチェックする意味は分かるのですが...

かなり分かりにくい説明で申し訳ないのですが、どなたか説明してくださる方いらっしゃいましたら教えて下さい...

回答

電話番号の数字の数は2個、4個、4個を‐で区切っているとは限らないので固定で
指定するとこのような結果になります。
どこまで考えるかによりますが提示されている内容から考えると
0<数字1個以上>-<数字1個以上>-<数字1個以上>
位しか想定出来ないかと思います。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。