• ベストアンサー

IPv6アドレスのチェック方法

PHP5.2.4を使用しています。 IPv4アドレス(今までの)のチェック方法は例えば、 //(CodeIgniterの一部です) function valid_ip($ip) { $ip_segments = explode('.', $ip); // Always 4 segments needed if (count($ip_segments) != 4) { return FALSE; } // IP can not start with 0 if (substr($ip_segments[0], 0, 1) == '0') { return FALSE; } // Check each segment foreach ($ip_segments as $segment) { // IP segments must be digits and can not be // longer than 3 digits or greater then 255 if (preg_match("/[^0-9]/", $segment) OR $segment > 255 OR strlen($segment) > 3) { return FALSE; } } return TRUE; } という具合にある程度決まったパターンがあると思うのですが、 IPv6でのこのようなPHPでのチェックプログラムパターンはあるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • mpx
  • ベストアンサー率71% (149/209)
回答No.2

>> IPv6でのこのようなPHPでのチェックプログラムパターンはあるのでしょうか? 御自分で関数を作ってみたいというのなら別ですが、filter関数を使うのが一般的かと考えます。 <?php $ip = "2001:0db8:85a3:08d3::8a2e:0370:7334"; if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === FALSE){ echo "$ip は有効なIP6アドレスでは有りません"; } else {echo "$ip は有効なIP6アドレスです";} ?> ちなみにIP4では、FILTER_FLAG_IPV4 フラグを使います。 御自分で作りたいのなら、以下の手順がシンプルでは? 1.16個の配列を準備して、全て0で初期化する 2.「::」の有無を確認する。無ければ、「:」で分割して配列に格納し、5へ 3.:: の右を「:」で分割して配列に後方より入れる 4.:: の左を「:」で分割して配列の先頭より入れる 5.個々の配列の値をチェックする。

takagoo100
質問者

お礼

ご返答ありがとうございます。 なるほど、そういう関数があったんですね。 自分の環境でもできましたし、使う機会があったら利用したいです。 ありがとうございます。

その他の回答 (1)

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 IPv6は ・16進数で表記された数値を16ビット単位で、コロン(:)で区切って表記する。 ・あるセクションが 0 で始まる場合、当該先行する 0 を省略することができる。 ・0 が連続するところは :: で省略することができる。ただし、:: は可変長なので、使えるのは1箇所だけ。 ・リンクローカルアドレスは(1つのサブネット内でのみユニークであるために)何らかの方法でネットワークインターフェースを指定してリンクを特定しなければならない。アドレス末尾に % 記号を介してインターフェースの番号や名称を付加するのが一般的である。 ・また、サブネットマスクは3ffe:1234:5678::/48のように表記される。この場合、先頭から48ビット (3ffe:1234:5678) がネットワークアドレス部である。 という特徴があるので。 これらの特徴を満たすように設計するだけなので、さほど難しくはないと思われます。 既存のクラスで存在するかについては…記憶にあるかぎりでは「見た事がない」ですね。

takagoo100
質問者

お礼

ご返答ありがとうございます。 自分としてはプログラム以前にもう少しIPv6の理解を深めたいです・・・

関連するQ&A