【PHP】入力文字列を正規表現を使って制限する方法

2020.04.21 /

【PHP】入力文字列を正規表現を使って制限する方法

PHPによるテキスト欄への入力可能な文字数や、使用可能な文字を制限する方法を説明します。

主にユーザー登録時のユーザー名やパスワードなどに使われていますね。

それでは実際のプログラムから具体的な説明まで順に解説していきます。

パスワードの入力を制限したプログラム

今回作成するプログラムは入力された文字列の文字数をチェックし、決められた文字を使われているかを確認するプログラムです。

例として、パスワードを入力させ、その入力された文字列が下記条件に合っているかをチェックするプログラムを作ってみます。

  • ・半角英数字と_(アンダースコア)のみ使用可能
  • ・8文字以上15文字以内
  • ・先頭文字は半角アルファベットのみ可能

テキストに入力された文字列が送信ボタンを押された後、上記条件に合っているかをチェックし、遷移したページに結果を出力します。

パスワードの入力

①にパスワードを入力したら、②の送信を押すことで、ページ遷移が発生します。

入力された文字列が条件に合っていれば、「パスワードは決まりに合っています。」と表示され、間違っていれば「パスワードは決まりに合っていません。」と表示されます。

プログラムのソースコード

どのようにして送られてきた文字列が条件に合うかチェックしているのか。

下記にそのソースコードを記しますので、どうやっているのか想像しながら見てください。

まずはパスワードを入力して、送信するhtmlファイルについて記します。

//ファイル名:password.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>パスワードの入力</title>
</head>
<body>
<form action="password.php" method="post">
<p>パスワードを入力:<input type="password" name="password"></p>
<p><input type="submit" value="送信"></p>
</form>
</body>
</html>

次は、送られてきた文字列が条件に合っているかチェックするPHPファイルについて記します。

//ファイル名:password.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>パスワードの入力確認</title>
</head>
<body>
<?php
$password = $_POST['password'];
if(preg_match("/^[a-z][a-z0-9_]{7,14}$/i", $password)) {
print "<p>パスワードは決まりに合っています。</p>";
}else {
print "<p>パスワードは決まりに合っていません。</p>";
}
?>
</body>
</html>

実際にご自身でも上記プログラムを打って、どのように動作するか確認してください。

XAMPPでのPHPプログラムの起動方法はこちらをご覧ください。

PHPファイル内で使われている関数などはこの後詳しく説明します。

それでは次にPHPファイル内で、どのようにして文字列チェックをしているのか、その仕組みを解説します。

文字列の形式チェックについて

正規表現とは

留学生

入力された文字列をどうやって条件に合っているかチェックしているんですか?

留学カウンセラー

実は正規表現のメタ文字を使って、入力された文字列を条件に合うか判別しています。

まずは正規表現について説明します。

正規表現とは、文字列の集合を一つの文字列(形式)で表現する、いわば文字列を抽象的に表現する方法です。

わかりやすく例を示すと、入力文字列や文章の中から郵便番号を探す際に、探す対象を先頭が〒で、そのあと数字が3桁、-、数字4桁が続く文字列と正規表現で表すことができるのです。

この正規表現を使えば、容易に入力された文字列が条件に合っているかをチェックすることができます。

正規表現は、ある文字列が郵便番号なのか、電話番号なのか、メールアドレス、URLかどうかなどなど様々なパターンでチェックすることができるのです。

PHPでは正規表現は多くの場面で使用されます。PHPを勉強するうえで正規表現は欠かせないものと言えます。

メタ文字とは

正規表現は、すでに説明してあるように「複数の文字列を一つの文字列(形式)で表現する方法」です。

ここで複数の文字列を一つの文字列で表現するために、特殊な文字を使う必要が出てきます。

正規表現で使われる、この特殊な文字のことをメタ文字と言います。

メタ文字には次のようなものがあります。

メタ文字 意味
. 任意の1文字
* 0回以上の繰り返し
+ 1回以上の繰り返し
? 0回または1回の繰り返し
^ 先頭
$ 末尾
| 選択
メタ文字 意味
( ) 正規表現のグループ
[ ] 文字クラス
{n} n回の繰り返し
{n,} n回以上の繰り返し
{n,m} n回以上m回以下の繰り返し
メタ文字を文字として扱う
/ パターンの最初と最後に指定

これらメタ文字を使って、特定の文字列を検索したり、入力された文字列の判別ができるようになります。

今回のプログラムでは、下記のように記述して、条件に合う文字列を表現しています。

"/^[a-z][a-z0-9_]{7,14}$/i"

簡単に上記正規表現について解説します。

最初の/(スラッシュ)はパターンの最初を表しています。その後に文字クラスを表す[]に続きます。

文字クラスとは文字を集めたもので、[]に挟まれた文字の1文字を表します。

なのでこの場合は、[a-z]がアルファベットaからzまでの1文字が先頭にきます。

その次に[a-z0-9_]{7,14}で、aからz、0から9または_のうちどれかが、7文字以上14字以下続くことを表しています。

最後のiは大文字と小文字を区別しないことを意味しています。

パターンマッチpreg_match()関数

最後に今回のプログラムで使用したパターンマッチ関数preg_match()について説明します。

この関数は、与えられた文字列がパターンに一致しているかを判別してくれます。

preg_match(正規表現,検索文字列{、一致した文字列を格納する配列、動作フラグ、検索開始位置}) ※{}内は省力可能です。

preg_match関数は正規表現で指定した文字列が、検索文字列にマッチした場合に1を、マッチしなかった場合は0を返します。

このように、正規表現のメタ文字とpreg_match関数を駆使して文字列の判別をします。

まとめ

今回の「【PHP】入力文字列を正規表現を使って制限する方法」はいかがでしたでしょうか?

ぜひ正規表現やメタ文字、パターンをチェックするpreg_match()の使い方を覚えて、より良いPHPプログラムを作れるようにしてください。