文字列内の値が 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
}