改进JavaScript功能

时间:2012-01-15 11:53:57

标签: javascript regex

我有下一个功能:

var checkNameLenght = function(name,nameLenght,allowedLenght,defaultName) {
    if((nameLenght <= allowedLenght) && !(/\s[^a-z]/i.test(name))) {
        return name; 
    }
        else {
            if(opts.debug == true) {
                console.log(name+' is to long or contains special characters / numbers | Please choose a name shorter than '+allowedLenght+' characters or remove any character / number');
            }
            return defaultName;
        }
}

它的作用是检查某个字符串是否多于或少于允许的长度,并检查该字符串是否包含任何特殊字符或数字(空格除外),如果确认上述任何字符串,则返回默认字符串,如果不是字符串。

但是这个函数同时检查长度和正则表达式if((nameLenght <= allowedLenght) && !(/\s[^a-z]/i.test(name))) { ... },但我不希望这样,我希望首先检查长度,然后检查正则表达式。

我试过这样:

var checkNameLenght = function(name,nameLenght,allowedLenght,defaultName) {
    if(nameLenght <= allowedLenght) {
        return name; 
    }
        else if( !(/\s[^a-z]/i.test(name)) ){
            return name;

        }
            else {
            if(opts.debug == true) {
                console.log(name+' is to long or contains special characters / numbers | Please choose a name shorter than '+allowedLenght+' characters or remove any character / number');
            }   
            return defaultName;
            }
}

但它不能作为第一个版本。第二个函数我做错了什么?

4 个答案:

答案 0 :(得分:4)

  

但它不能作为第一个版本

嗯不,你改变了逻辑。你没有说第二个版本是如何工作的确切错误(或者它是否给你一个错误?)所以很难确切地说出错了什么。但我会猜一猜。

在第二个版本中,您首先检查长度,如果该测试通过,立即返回name而不进行任何进一步的测试。如果你还需要测试正则表达式,那么要么使用第一个版本的&&语法,要么将第二个测试嵌套在第一个if块中。

  

它还检查字符串是否包含任何特殊字符或数字(空格除外),如果确认上述任何一项,则返回默认字符串,如果不是字符串。

实际上,这不是你所拥有的正则表达式。这是你的:

!(/\s[^a-z]/i.test(name))

正则表达式正在测试name是否包含空白字符,后面紧跟任何非字母字符,然后其结果是不应用!。因此,如果您的字符串包含不会立即跟随空格的非字母字符,则无法找到它们。如果您的目标是测试字符串A-Z或空格中的任何字符,请在字符串中的任何位置进行测试,然后尝试:

!(/[^a-z\s]/i.test(name))

或者只是测试整个字符串是否由有效字符组成,而不是查找无效字符:

/^[a-z\s]*$/i.test(name)          // note: you don't need the ! for this

//  ^        - match beginning of string
//  [a-z\s]* - match zero or more alphabet or white space characters
//  $        - match end of string

此外,您不需要nameLenght参数,因为字符串具有内置的长度属性:您可以使用name.length。 (这显然不会使功能停止工作,但它有点不整洁。)

(你也拼错了“长度”,但你似乎已经在每个变量名中都这样做了,所以它不会引起问题。但是。)

编辑:根据您的评论工作的新版本:

var checkName = function(name, allowedLength, defaultName) {
        if(name.length > allowedLength) {
           console.log("Name is more than allowed length");
           return defaultName;
        }
        if( /[^a-z\s]/i.test(name) ){
           console.log("Name contains special characters or numbers");
           return defaultName;
        }

        // tests passed
        return name;
};

注意:您不需要任何else语句,因为每个if都会返回该函数。显然,您可以删除我放入的console.log()语句,或者您可以添加原始文件中的if(opt.debug)语句。

答案 1 :(得分:1)

首先,你真的不需要else,如果你的第一个条件是true,函数将返回name并停止,所以第一个改进将是:< / p>

var checkNameLenght = function(name,nameLenght,allowedLenght,defaultName) {
    if((nameLenght <= allowedLenght) && !(/\s[^a-z]/i.test(name))) {
        return name; 
    }

    if(opts.debug == true) {
       console.log(name+' is to long or contains special characters / numbers | Please choose a name shorter than '+allowedLenght+' characters or remove any character / number');
    }
    return defaultName;    
}

现在,您想首先检查长度,您需要执行以下操作:

var checkNameLenght = function(name,nameLenght,allowedLenght,defaultName) {
    if(nameLenght <= allowedLenght) {
        if( !(/\s[^a-z]/i.test(name)) ) {
          return name;
        } 
    }

    if(opts.debug == true) {
       console.log(name+' is to long or contains special characters / numbers | Please choose a name shorter than '+allowedLenght+' characters or remove any character / number');
    }
    return defaultName;    
}

目前尚不清楚是否希望else仅在nameLength较大或正则表达式匹配时执行,因此您可能需要相应地编辑我的代码。

答案 2 :(得分:1)

使用来自 nnnnnn 的一些想法,我认为你的意思是这样的

    var checkName = function(name, allowedLength, defaultName) {
        if (name.length > allowedLength) {
            if (opts.debug == true) {
                console.log(name + ' is to long | Please choose a name up to ' + allowedLength + ' characters');
            }   
            return defaultName;
        }
        else if (/[^a-z\s]/i.test(name)) {
            if (opts.debug == true) {
                console.log(name + ' contains special characters or numbers | Please remove any character or number');
            }   
            return defaultName;
        }
        else {
            return name;
        }
    }

答案 3 :(得分:1)

你的第一种方法是正确的。它不会同时检查

在Javascript A&amp;&amp; B的工作原理如下:

  1. 首先检查条件A
  2. 如果A为假,则会转到其他条件
  3. 如果A为真,则会检查条件B
  4. 如果B为假,则会转到其他条件
  5. 如果B也为真,它将执行if
  6. 中的语句

    所以你的第一种方法是正确的。 就像@nnnnnn所说的问题是正则表达和条件。 由于这两个条件必须是真的,它应该是

    if(name.length <= allowedLength && /^[a-z\s]*$/i.test(name)) {
        return name;
    }else{
        ....
    }
    

    如果你给

    if(nameLenght <= allowedLenght) {
        return name; 
    }else if( !(/\s[^a-z]/i.test(name)) ){
        return name;
    }
    else {
        ....
    }
    

    当前两个条件中的任何一个变为真时,它将返回name,这不是您的要求。