0

我有这样的功能:

var name_regex = /^[a-zA-Z0-9_ -]{3,32}$/,
body_regex = /^[a-zA-Z0-9_ -]$/,
email_regex = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/,
phone_regex = /^[0-9-]{3,32}$/,
error_count;

function validation_test (name, value) {
    var test_name = name + '_regex';
    console.log(test_name);
    error_count = 0;
    if(!test_name.test(value)){
        error_count += 1;
    }
}

如果我尝试运行它(提交时),我会收到以下错误:

test_name.test 不是函数

console.log(test_name) 为我提供了变量的正确名称(例如 name_regex)。我怎样才能使这个变量起作用?

4

4 回答 4

5

只需使用一个对象:

var regexes = {
    name: /^[a-zA-Z0-9_ -]{3,32}$/,
    body: /^[a-zA-Z0-9_ -]$/,
    email: /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/,
    phone: /^[0-9-]{3,32}$/
};



function isValid(name, value) {
    return regexes[name].test(value);
}

在您的其他代码中:

   if( !isValid( "phone", 123 ) ) {
       alert("Invalid phone");
   }
于 2012-11-19T22:05:17.460 回答
1

变量 test_name 应该是正确的 regExp 对象https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/test

考虑

...
function validation_test (name, value) {
    var test_name = name + '_regex';
    console.log(typeof(test_name)); // string
...

由于控制台日志上方的行上的串联而发生

于 2012-11-19T22:05:30.357 回答
1

您是否尝试调用该函数,例如

validation_test('phone', '9184079201');

如果是这样,我建议将您的正则表达式放入一个对象中:

var regex = {
    'name':  '...',
    'body':  '...',
    'email': '...',
    'phone': '...',
};

function validation_test(name, value) {
    if(!regex[name].test(value)) {
        //...
    }
}

这样你就可以通过字符串查找它们。

于 2012-11-19T22:07:27.283 回答
0

test_name是一个字符串,而不是它所代表的正则表达式,所以!test_name.test(value)不会做你想做的事。

既然您没有name在函数中使用其他任何地方,为什么不直接将正则表达式作为参数传递呢?

function validation_test (test_name, value) {
    error_count = 0;
    if(!test_name.test(value)){
        error_count += 1;
    }
}
于 2012-11-19T22:05:37.147 回答