0

我有一个这样的数组(console.log 的输出):

["122.42.123.1", "122.42.123.1", "122.42.123.1", "awdawd", "awdawd"]

我如何检查它是否只包含 IP 地址,如果是的话return true?如果它没有(如上面的例子)return false

我尝试了在这里和谷歌上找到的各种功能(比如这个),并在每个循环中使用它们,但这不起作用:

//Get ip list from a textarea (each row = 1 ip)
var content = $("#banUList").val();
var ips = content.split("\n");
console.log(ips);

$(ips).each(function(){

    if(checkFunction($(this)) == false){
        //Wrong
    }else{
        //correct
    }

});

如果可能的话,我想完全避免这个循环,并有一个函数来检查整个数组是否有任何var不是 IP 的。不管有多少vars

4

5 回答 5

4

此功能将按您的意愿执行:

function ipOnly(arr) {
    for(var i=0,l=arr.length;i<l;i++)
        if(!/^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$/.test(arr[i])) 
            return false;
    return true;
}

小提琴:http: //jsfiddle.net/DWQzm/

于 2012-05-16T14:57:32.687 回答
1
function isValidIp(value){
    // The code you got from google
    return true/false;
}

var valids = [];

$.each(ips, function(){
  if (isValidIp(this))  
      valids.push(this);
});

或者使用 jQuerygrep工具:

var valids = $.grep(ips, function(element){
                 return isValidIp(element);
             });   

如果您只想在所有地址都有效\无效时获得真\假:

var areAllValid = $.grep(ips, function(element){
                        return !isValidIp(element);
                     }).length === 0;
于 2012-05-16T14:52:24.810 回答
1

您可以使用正则表达式来验证 IP 地址:

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

http://www.regular-expressions.info/examples.html

挑战:比我更有经验的正则表达式可能会编写一个多行感知正则表达式,可以在一次扫描中验证整个文本区域,而无需使用任何循环。

于 2012-05-16T14:52:30.797 回答
1

不使用循环就不可能检查列表的所有条目。要完成您的源代码:

function arrayConsistsOfIPAddresses(ips) {
   var result = true;
   $(ips).each(function() {
     result &= isIPAddress($(this));
   }
   return result;
}

您可以使用 jbabey 发布的正则表达式来实现该功能isIPAddress

function isValidIPAddress(value) {
    var ipRegex = /b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/b
    return value.match(ipRegex); 
}
于 2012-05-16T14:55:09.760 回答
0

这个不使用循环 演示的版本怎么样

// regex from http://tools.netshiftmedia.com/regexlibrary/
var re = /((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})/g; 

function isArrIpOnly(arr) {
  return arr.toString().match(re).length==arr.length;
}


var arr = ["122.42.123.1", "122.42.123.1", "122.42.123.1", "awdawd", "awdawd"];   

alert(isArrIpOnly(arr));
于 2012-05-16T15:10:32.457 回答