2

我想验证广播和多播 IP 地址,即我正在使用的两个 IP 地址:255.255.255.0229.0.0.20.

我想在输入多播或广播 IP 时发出警报。

以下代码适用于多播地址,但如何验证广播地址?

[ 
  'validate-mcast-ip',
  'Please enter a valid multicast IP in this field.',
  function(v) {
    if (v == "") return true;
    if (v == "0.0.0.0") return false;

    ipPattern = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
    ipArray = v.split(".");
    isIP = ipPattern.test(v);
    if (isNaN(ipArray[0]) || ipArray[0] < 224 || ipArray[0] > 239) {
        isIP = false;
    }
    for (i = 1; i < ipArray.length; i++) {
        if (isNaN(ipArray[i]) || ipArray[i] > 255) {
        isIP = false;
        }
    }
    return isIP;
  }
]
4

2 回答 2

3

一个“简单”的正则表达式/^(2(?:2[4-9]|3[0-9]))\.([0-2]?[0-9]?[0-9])\.([0-2]?[0-9]?[0-9])\.([0-2]?[0-9]?[0-9])$/g应该完全符合您的要求。

function validateMulticastIP(ip) {
    return !!ip.match(/^(2(?:2[4-9]|3[0-9]))\.([0-2]?[0-9]?[0-9])\.([0-2]?[0-9]?[0-9])\.([0-2]?[0-9]?[0-9])$/g);
}
validateMulticastIP('2.3.5.6'); //false
validateMulticastIP('2'); //false
validateMulticastIP('230.3.5.6'); //true
validateMulticastIP('255.255.255.0'); //false
validateMulticastIP('229.0.0.20'); //true

正则表达式 101 演示

于 2013-04-23T18:36:54.070 回答
0

那么你到底想做什么呢?您正在检查 IP(已解析为包含四个项目的数组)是否符合您设置的一些限制。假设您只想允许224.0.0.0 和 239.255.255.255(含)之间的所有 IP 地址,以及225.225.225.0 和 229.0.0.20 这两个地址(就像您最初所说的那样)。你怎么做到这一点?

首先,检查 IP 是否在 224.0.0.0 和 239.255.255.255 之间。为此,人们可以很容易地看到只需要检查第一个数字。所以:

if(ipArray[0]<224||ipArray[0]>239)
    return false;

但是等等:如果 IP 地址是 225.225.225.0 或 229.0.0.20,我们不应该返回false!所以我们最后的代码片段变成了:

if((ipArray[0]<224||ipArray[0]>239)&&v!="255.255.255.0"&&v!="229.0.0.20")
    return false;

请注意,||条件开头的部分是“带括号的”(因为没有更好的词)。这是因为如果我们不这样做,Javascript 解释器会认为我们的意思是:

if(ipArray[0]<224||(ipArray[0]>239&&v!="255.255.255.0"&&v!="229.0.0.20"))
    return false;

这是因为&&运算符具有比运算符更高的优先级(请阅读文章的那部分!)||

所以现在,用我们新发现的知识,让我们重写你的原始代码:

function (v) {
    if(v=="") return true;
    if(v=="0.0.0.0") return false;

    if(!v.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/)) return false;
    ipArray = v.split(".");
    //We don't need to check for NAN anymore because it matched your
    //beautiful regex above
    if((ipArray[0]<224||ipArray[0]>239)&&v!="255.255.255.0"&&v!="229.0.0.20")
        return false;
    return true; //if we've reached this point, the IP conforms to the restrictions!
}

你的问题得到解答了吗?如果是这样,请不要忘记帮助 Stack Overflow 并将此答案标记为已接受(绿色复选标记)!

于 2013-04-23T08:37:19.157 回答