Techioz Blog

文字列内の値が IP アドレスであるかどうかを確認するにはどうすればよいですか

概要

これをするとき

ip = request.env["REMOTE_ADDR"]

クライアントのIPアドレスを取得します。しかし、変数の値が本当に IP であるかどうかを検証したい場合はどうすればよいでしょうか? それ、どうやったら出来るの?

助けてください。 前もって感謝します。そして、この質問が繰り返されたら申し訳ありませんが、私はそれを見つける努力をしませんでした…

編集

IPv6 IP についてはどうですか??

解決策

Ruby には、標準ライブラリに必要な Regex がすでに含まれています。 チェックアウトの解決。

require "resolv"

"192.168.1.1"   =~ Resolv::IPv4::Regex ? true : false #=> true
"192.168.1.500" =~ Resolv::IPv4::Regex ? true : false #=> false

"ff02::1"    =~ Resolv::IPv6::Regex ? true : false #=> true
"ff02::1::1" =~ Resolv::IPv6::Regex ? true : false #=> false

それが気に入れば、すぐに…

require "resolv"

!!("192.168.1.1"   =~ Resolv::IPv4::Regex) #=> true
!!("192.168.1.500" =~ Resolv::IPv4::Regex) #=> false

!!("ff02::1"    =~ Resolv::IPv6::Regex) #=> true
!!("ff02::1::1" =~ Resolv::IPv6::Regex) #=> false

楽しむ!

アップデート:

以下のコメントから、IPv4 または IPv6 をチェックするための非常に短いバージョンが気に入っています。

!!(ip_string =~ Resolv::AddressRegex)

Rails を使用すると非常にエレガントになります (以下からの回答もあります):

validates :ip,
          :format => {
            :with => Resolv::AddressRegex
          }