PHP 正規表現でIPアドレス形式の文字列か判定

2016/04/08

正規表現でIPアドレスの入力チェック

概要

フォームで入力されたIPアドレスが正当な文字列か判定するためのバリデーション処理を実装します。
基本的にはPHPの正規表現を使用しますが、細かいオクテットなどのチェックは独自にプログラミングします。

今回は、オクテットが0~255の数値であるかをチェックした後、ネットワークアドレス、ブロードキャストアドレス、ループバックアドレスの場合はエラーとします。

参考コード


/**
 * IPアドレス形式の文字列の場合trueを返す
 *
 * @param string @ip IPアドレス
 * @return void
 */
function valid_ip( $ip ) {
	// 3桁以内数値がドット区切りで4つあるかチェック
	if ( ! preg_match( "/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/", $ip ) ) {
		return false;
	}

	// 各オクテットのチェック
	if ( ! valid_ip_octet( $ip ) ) {
		return false;
	}

	// ネットワークアドレスの場合(ホスト部のビットが全て0)
	if ( substr( $ip, -4 ) == '.0.0' ) {
		return false;
	}

	// ブロードキャストアドレスの場合(ホスト部のビットが全て1)
	if ( substr( $ip, -8 ) == '.255.255' ) {
		return false;
	}

	// ループバックアドレスの場合(127.0.0.1)
	if ( $ip == '127.0.0.1' ) {
		return false;
	}

	return true;
}

/**
 * 各オクテットが 0~255 である場合はtrue、そうでない場合はfalseを返す
 *
 * @param string @ip IPアドレス
 * @return void
 */
function valid_ip_octet( $ip ) {
	$octets = explode( '.', $ip );

	foreach( $octets as $octet ) {
		if ( ctype_digit($octet) === false || $octet < 0 || $octet > 255 ) {
			return false;
		}
	}

	return true;
}

上記関数を使用する場合は次のようになります。


$ipaddress = 'xxx.xxx.xxx.xxx';

if (valid_ip($ipaddress)) {
	echo 'IPアドレスかもしれません。';
} else {
	echo 'IPアドレスではありません。';
}
Related

Vagrant+Docker+PHP環境で「session.save_path」指定時に、セッションファイルが空になるエラー

ファイル共有でのフォルダの所有者を設定 結論 PHP5.4.28 からセッションファイルのownerはrootもしくはWebサーバのユーザに限るという制限が...

LINEと連携したテイクアウト事前注文システム徹底比較!

目次 テイクアウト予約・注文受付システムのトレンド LINEと連携したテイクアウト事前注文システムの価格表 L.B.B.Cloud テイクイーツ ...

PHPで動画の撮影日を取得

PHPで動画の撮影日を取得 概要 PHPからffprobeコマンドを実行し、動画の撮影日時を取得します。 コード $posted_at = ...

FullCalendarでGoogleカレンダーのようなUIを実装

jQueryプラグインFullCalendarのサンプル 概要 FullCalendarを使用して、GoogleカレンダーのようなUIを実装する使用例を...

PHP Laravel5.2でmulti-auth(複数テーブルでの認証)を実装

Laravel5.2でマルチ認証 概要 LaravelとはPHPの中で今最も伸びているフレームワークです。 処理速度が遅いなどありますが、かなり使い安く拡...

rbenv環境でRuby on Railsのアプリケーションを一瞬で自動生成

アプリケーション構築時に最初に行う手順 概要 アプリケーションを作成するまでの手順を記載しています。 rbenvなどの環境が設定済と仮定して話を進めま...
トップへ戻る