PHPでIPアドレスの範囲チェックを行う2つの方法

もしある文字列がIPアドレスか調べたい場合、PHPでは次の2つの方法が使えます。

  • 正規表現で範囲チェック
  • filter_var関数を使ったチェック

一般的には正規表現を使うのが多いですが、filter_var関数でも同じことが可能です。

そういう訳でこの2つのチェック方法とそのコード例を紹介

IPアドレスの範囲について

まず初めにIPアドレスの範囲について少しだけ解説

そもそもIPアドレスには次の2つの形式があります。

  • IPv4
  • IPv6

そしてこの2つの範囲は次で説明する通り

 

まずIPv4の方ですが、これは次のような形式を持つIPです。

ドット ( .  ) で区切られた xxx には 0 ~ 255 までの数値(10進数)が入ります。

つまりIPv4の範囲は 0.0.0.0  ~ 255.255.255.255  までの間ということ

 

そして次にIPv6ですが、これは次のような形式を持つIPアドレスです。

セミコロン ( :  ) で区切られた xxxx には 0 ~ fff までの数値(16進数)が入ります。

つまりIPv6形式のアドレスの範囲は 0:0:0:0:0:0:0:0  ~ ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff  までの間ということ

ただし16進数で表現されることに注意が必要です。

 

以上がIPアドレスの2つの形式 IPv4 と IPv6 の範囲

ここではこのどちらか一方ではなく、どちらでも範囲チェックできる方法を紹介します。

IPアドレスチェックの2つの方法

IPの範囲チェック方法は冒頭でも触れたように次の2つ

  • 正規表現で範囲チェック
  • filter_var関数を使ったチェック

個人的には長い正規表現を書くよりもfilter_var関数を使う方がスマートだと思います。

この2つの方法の具体的なやり方とかコード例は次の通り

正規表現でIPの範囲チェック

IPの範囲チェックというと真っ先に思いつくのがこの正規表現

IPv4またはIPv6にマッチする正規表現を書いて preg_match で判定するだけです。

 

まずIPv4にマッチさせたい場合、次のような正規表現を書けばOK

このQiitaページから引用したものですが、やっぱり長いですね・・・

 

そして次がIPv6とマッチさせる正規表現

これはこちらのページに書かれていたものですが、めちゃくちゃ長いです。笑

IPv6には細かなルールがあって厳密にマッチさせたい場合はここまで長くなる模様

 

それでこれらの正規表現をpreg_match関数で使えばIPが正しいかチェックできます。

例えば次はIpv4の範囲チェックを行っているコード例

IPv6の場合も正規表現を変えれば同様に範囲チェックが可能です。

 

以上が正規表現を使ったIPアドレスのチェック方法

IPv4はまだしもIPv6は厳密にマッチさせようとすると長ったらしくなります。

filter_var関数でIPの範囲チェック

お次はPHPでデータをフィルタリングする関数 filter_var  を使う方法

次のようにチェックデータを $data  、フィルタする形式を $filter  として実行します。

そして返り値は

  • フィルタ形式に当てはまる場合はフィルタリングされたデータ、
  • もし不正な形式のデータだった場合は FALSE

が返ってくるようです。

IPアドレスのチェックにはフィルタ形式に FILTER_VALIDATE_IP  を渡せばOK

もし filter_var  の返り値が FALSE  なら正しいIPアドレスじゃないと分かる訳です。

 

例えば次はIPv4形式のIPの範囲チェックをしているコード例

さっきの正規表現を使う方法よりも大分スマートです。

 

もちろんIPv4だけでなくIPv6での範囲チェックも可能

あの長ったらしい正規表現を使わなくていいので楽ですね。

 

以上がfilter_var関数でIPアドレスの範囲チェックを行う方法

こちらの方が正規表現を使うよりコードも少なく、簡単にチェックができます。

補足 : メルアドやURLを形式チェックするには・・

ここまででIPアドレスの形式チェック方法を紹介してきました。

filter_var関数を使った方が正規表現を長々と書くよりも簡単ですね。

 

ちなみにfilter_var関数ではメルアドやURLの形式チェックも可能です。

詳しいやり方やコード例は次記事をどうぞ

IPアドレスと同じく規格的に正しい形式かどうかを数行のコードで簡単に判定できます。

ここまでのまとめ

ということでIPアドレスの範囲チェック方法をもう一度まとめ

  • 正規表現で範囲チェック
    IPアドレスのパターンにマッチするかを preg_match  を使って判定する。
    ただしパターンがとてつもなく長くなるのでベストな方法ではない
  • filter_var関数で範囲チェック
    この関数のフィルタ形式に FILTER_VALIDATE_IP  を渡せば判定できる
    こっちの方が長ったらしい正規表現が必要ない分だけスマート

PHPではfilter_var関数を使った方が楽に範囲チェックができそうですね。

正規表現も悪くはないですが、あそこまで長くなるとちょっと・・・という感じです。

以上PHPでIPアドレスの範囲チェックを行う方法についてでした。

PHP

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください