正規表現でIPアドレスかどうか調べる

(1/1)
今回は、正規表現を使って、与えられた文字列が IP アドレスかどうか調べるプログラムを作ってみることにする。

(2021年8月28日)PHP8対応,大幅改訂

サンプル・プログラムの実行例

正規表現でIPアドレスかどうか調べる

サンプル・プログラム

圧縮ファイルの内容
checkip.phpサンプル・プログラム本体

IPアドレス

IPアドレス(IPv4)の構造は
A.B.C.D  (※)A〜Bは0以上255以下の整数
である。
これを正規表現で表すと、
/^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/
となる。なお、この正規表現だけでは「0以上255以下の整数」のチェックができないので、PHPのロジックでチェックすることにする。

今回使った正規表現

^
文字列の先頭、または行終端文字の直後にマッチする。
$
文字列の末尾、または行終端文字の直前にマッチする。
[...]
文字クラス。
この中に記述された文字の並びのうちの1文字を表す。
-
文字の範囲指定。
a-z はアルファベット小文字すべてに、0-9は数字すべてにマッチする。
-
文字の範囲指定。
a-z はアルファベット小文字すべてに、0-9は数字すべてにマッチする。
{a,b}
直前のパターンの a 回以上、b 回以下の繰り返し。
ここでは、文字クラス [0-9] に記述される数字が 1 桁以上 3 桁以下であることを示す。
(...)
サブパターン。
マッチングだけであれば不要だが、置換を行うために、マッチした部分文字列に番号を付けてやる必要がある。その場合にサブパターンを用いる。
[^....]
文字クラス内の否定。
文字クラス内“以外の”文字にマッチする。
(...)
サブパターン。
マッチングだけであれば不要だが、4つの整数部分を取り出して定義域チェック(0 以上 255 以下)を行うために、マッチした部分文字列に番号を付けてやる必要がある。その場合にサブパターンを用いる。

サンプル・プログラムの解説

 126: /**
 127:  * IPアドレスかどうか検査する
 128:  * @param   string $str チェックするテキスト
 129:  * @return  string IPアドレス/FALSE(IPアドレスではない)
 130: */
 131: function is_ipadr($str) {
 132:     $pat = '/^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/';
 133:                                                 //IPアドレスを表す正規表現
 134:     preg_match($pat, $str, $regs);
 135: 
 136:     //定義域チェック (0 ≦ IP ≦ 255)
 137:     for ($i = 1$i <4$i++) {
 138:         if (!isset($regs[$i]))  return FALSE;
 139:         if ($regs[$i< 0 || $regs[$i> 255)    return FALSE;
 140:     }
 141: 
 142:     return $regs[0];
 143: }

与えられた文字列が IP アドレスかどうかを検査する処理は、ユーザー関数 is_ipadr として用意した。

ユーザー関数 is_ipadr では、まず、与えられた文字列が前述の正規表現のマッチするかどうか調べる。
続いて、4 つある整数部分が 0 以上 255 以下になっているかどうかを if 文を使って検査する。

メインプログラムとHTML表示処理については、「正規表現でURLをリンクに変換する」とほぼ同じである。
(この項おわり)
header