如何检查字符串是否包含javascript中任何一点的字符

时间:2015-01-07 13:36:36

标签: javascript regex string

我需要知道字符串在字符串的任何一点是否包含一个字符(一次或多次)。 例如,使用字符“&”:

“& hfds”无效,“%$ /& h&”无效等。

我这样做是密码验证的一部分:

function applySpecialCharacterFilter(password) {
    if (password.match(/([!,%,@,#,$,^,*,?,_,~])/)) {
        return 1;
    } else if(password.match(/([&])/)) {
        throw new Error('Das Passwort enthält unerlaubte Zeichen.');
    }
    return 0;
}

在第一部分中,它检查密码是否包含任何允许的字符,然后增加验证的值。但是,包含不允许的字符的密码可以通过。 如果我试图抓住它,使用else,但只有当它不在像$%&

这样的特殊字符序列中时才有效

谢谢

编辑:

这是整个功能:

function checkStrength(password){
        var strength = 0;
        var passwordMessage = $('#passwordMessage');

        if (password.length == 0) {
            result.removeClass();
            return '';
        }

        if (password.length < 6) {
            validPassword = false;
            result.removeClass();
            result.addClass('short');
            return 'Too short';
        } else if(password.length > 8) {
            validPassword = false;
            result.removeClass();
            result.addClass('short');
            return 'Too long';
        } else {
            strength += 1;
        }

        try {
            strength += applyLowerAndUpperCaseFilter(password);
            strength += applyNumbersAndCharactersFilter(password);
            strength += applySpecialCharacterFilter(password);
            strength += applyTwoSpecialCharacterFilter(password);
            strength += applyAlphabeticalCharacterCriteria(password);
        } catch(error) {
            validPassword = false;
            result.removeClass();
            result.addClass('short');
            passwordMessage.html('').append('<p>TPassword contains invalid characters!</p>');
            return 'Invalid';
        }

        passwordMessage.html('');

        if (strength <= 2) {
            validPassword = false;
            result.removeClass();
            result.addClass('weak');
            return 'Schwach';
        } else if (strength <= 3 ) {
            validPassword = true;
            result.removeClass();
            result.addClass('good');
            return 'Good';
        } else {
            validPassword = true;
            result.removeClass();
            result.addClass('strong');
            return 'Strong';
        }
    }

    function applyLowerAndUpperCaseFilter(password) {
        if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))
            return 1;
        return 0;
    }

    function applyNumbersAndCharactersFilter(password) {
        if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/))
            return 1;
        return 0;
    }

    function applySpecialCharacterFilter(password) {
        if (password.match(/^([!%@#$^*?_~]+)$/)) {
            return 1;
        } else if(password.match(/([&])/)) {
            throw new Error('Das Passwort enthält unerlaubte Zeichen.');
        }
        return 0;
    }

    function applyTwoSpecialCharacterFilter(password) {
        if (password.match(/(.*[!,%,@,#,$,^,*,?,_,~].*[!,",%,@,#,$,^,*,?,_,~])/))
            return 1;
        else if(password.match(/([&])/))
            throw new Error('Das Passwort enthält unerlaubte Zeichen.');
        return 0;
    }

    function applyAlphabeticalCharacterCriteria(password) {
        var quality = 0;
        var sequences = [
            'abcdefghijklmnopqrstuvwxyz',
            '01234567890',
            '!\"§$%/()=?'
        ];

        var proceed = true;
        for(var i=0; i<(password.length-3); i++) {
            for(var index = 0; index < sequences.length; index++) {
                var needle = password.substring(i, 3);
                if(stripos(sequences[index], needle) != false) {
                    quality -= 1;
                    proceed = false;
                }
                if(proceed == false) break;
            }
            if(proceed == false) break;
        }
        return quality;
    }

    function stripos(f_haystack, f_needle, f_offset) {
        var haystack = (f_haystack + '')
            .toLowerCase();
        var needle = (f_needle + '')
            .toLowerCase();
        var index = 0;

        if ((index = haystack.indexOf(needle, f_offset)) !== -1) {
            return index;
        }
        return false;
    }

消息和类仅用于实时验证输出。 规则: 密码长度必须介于6到8个字符之间 它必须至少有1个大写和1个小写字符 它必须有数字 它必须有1个特殊字符(2给出更多价值) 只允许这些特殊字符 - _。 :,; ! @§$%/ =? #
如果可能,字符不应出现在序列中,因此不能使用abc,123,!§$ etc。

2 个答案:

答案 0 :(得分:0)

你必须锚定第一个正则表达式并添加一个量词:

if (password.match(/^([!,%,@,#,$,^,*,?,_,~]+)$/)) {
//             here ^                      ^ ^

除非您想要匹配,否则逗号不是强制性的:

if (password.match(/^([!%@#$^*?_~]+)$/)) {

答案 1 :(得分:0)

您可以使用indexOf方法:

function applySpecialCharacterFilter(password) {
    if (password.indexOf('&')>-1) {
        throw new Error('Das Passwort enthält unerlaubte Zeichen.');
    }
    if (password.match(/^([!,%,@,#,$,^,*,?,_,~]+)$/)) {
        return 1;
    }
    return 0;
}

您需要根据@M42 answer

更改正则表达式