フォームで入力された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アドレスではありません。';
}