Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Валидация e-mail в форме. (http://www.flasher.ru/forum/showthread.php?t=112633)

Ведьмак 03.06.2008 19:36

Валидация e-mail в форме.
 
Господа, подскажите, как сделать нормлаьную развернутую проверку валидности ящика введенного в поле формы а AS2?

Проверить на точку, собаку, тире в начале, цифры в конце могу и сам ))

Заранее все спасибо..

wvxvw 03.06.2008 22:08

Ого... кса, задача, хоть и банальная - небанальная, отнюдь (у меня есть, например, один почтовый ящик с которым вечно проблемы из-за грамотеев решивших, что в домейном имени низзя дефисы) =)
Во-первых: существует стандарт для е-маил аддрессов... но он очень много чего позволяет... например: "My e{$}mail"@a-b по стандарту - валидный аддресс =) Но подавляющее большинство почтовиков ессно не разрешат зарегистрировать такое чудо =) А вообще, есть имплементация RegEхp класса для АС2... можно погуглить на эту тему, ну а дальше - уже как бог на душу положит...
*да, я как-то использовал, в ней были какие-то баги связанные с большим количеством бекслешей и еще какие-то, но, вобщем, вполне терпимо* =)
Или если не хочется его искать - я бы делал как-нибудь через charCodeAt();
Код:

function validateEmail(s:String):Boolean {
        if(s.indexOf('..')>=0) return false;
        var sl:Number = s.length;
        var i:Number = 0;
        var ss:Number;
        var isLocalName:Boolean = true;
        var domainName:Boolean = false;
        var domainZone1:Boolean = false;
        var domainZone2:Boolean = false;
       
        var hasDomainName:Boolean = false;
        var hasDomainZone:Boolean = false;
        while (i < sl) {
                ss = s.charCodeAt(i);
                //trace(ss);
                switch (ss) {
                        case -1:
                        case 33:
                        case 34:
                        case 35:
                        case 36:
                        case 38:
                        case 39:
                        case 40:
                        case 41:
                        case 42:
                        case 43:
                        case 47:
                        case 58:
                        case 59:
                        case 60:
                        case 61:
                        case 62:
                        case 63:
                        case 91:
                        case 92:
                        case 93:
                        case 123:
                        case 124:
                        case 125:
                                return false;
                        case 64:
                                if (!isLocalName || !i) return false;
                                isLocalName = false;
                                hasDomainName = true;
                                domainName = true;
                                break;
                        case 45:
                                if (!i) return false;
                                break;
                        case 46:
                                if (!i) return false;
                                if (isLocalName) break;
                                if (domainName) {
                                        domainName = false;
                                        hasDomainZone = true;
                                        domainZone1 = true;
                                } else if (domainZone1) {
                                        domainZone1 = false;
                                        domainZone2 = true;
                                } else {
                                        return false;
                                }
                                break;
                        default:
                                if (ss > 47 && ss < 122) {
                                        break;
                                } else {
                                        return false;
                                }
                }
                i++;
        }
        if(hasDomainName && hasDomainZone) return true;
        return false;
}
trace(validateEmail('abc.d12-3@hotmail.com'));

Не бог весть, но с пивом покатит =)

qazwsx 04.06.2008 10:41

Код:

function checkEmail (e) {
        var i, j, l = e.length;
        var foundPoint = false;

        function checkChars (s, i, l) {
                while (i < l && ("_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789").indexOf(s.charAt(i)) != -1){
                        i++;
                }
                return i;
        }
        function checkFirstLevelDomainChars (s, i, l) {
                while (i < l && ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").indexOf(s.charAt(i)) != -1) {
                        i++;
                }
                return (i == l);
        }
        trace(e);

        // every email starts with a string
        if ((i=checkChars(e, 0, l)) == 0) {
                return -1;
        }
        //init j
        j=i;

        // followed by an arbitrary number of ("." string) combinations
        while (i < l && e.charAt(i) == ".") {
                // skip the point
                i++;
                // if there are no chars, we have an error
                if ((j=checkChars(e, i, l)) == i) {
                        return -2;
                }
                // else skip the chars
                i = j;
        }
        // then follows the magic @
        if (e.charAt(i) != "@"){
                return -3;
        }

        // followed by minimum one string point string
        // after the last point minimum 2 characters are allowed

        do {
                // skip the @ (j == i at the beginning, so it is like i++)
                i = j+1;
                // do we have more chars ?
                j = checkChars(e, i, l);
                if (j == i) {
                        // no more chars found -> error
                        return -4;
                } else if (j == e.length) {
                        // emailaddress is finished, do we have a first level domain ?
                        j -= i;
                        // we have one if it is at least 2 long and consists of the correct characters
                        if(foundPoint && j>=2 && checkFirstLevelDomainChars(e, i, l)){
                                return 1
                        } else {
                                return -5
                        }
                }
                // if we reach the end or don't have a point, we return an error
                foundPoint = (e.charAt(j) == ".");
        } while (i < l && foundPoint);
        return -6;
}


Ведьмак 04.06.2008 14:14

Ого ) Сейчас попробую..

2 wvxvw: с RegExp я уже пробовал возиться, но что-то так и не запустил его, решил, что он вобщем-то только с AS3 дружит..

2 qazwsx: немного запутался в вашем коде.. может подскажите, что функиция должна вернуть при удачной валидации и при неудачной?

Попробовал первый вариант...
2 wvxvw: валидирует такую ерунду вроде ewer@.qweqwe

второй вариант был тоже дырявый, привел его более менее рабочий вариант (если кому надо) :
Код:

function checkEmail(e) {
        var i, j, l = e.length;
        var foundPoint = false;

        function checkChars(s, i, l) {
                while (i<l && ("_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789").indexOf(s.charAt(i)) != -1) {
                        i++;
                }
                return i;
        }

        function checkFirstChars(s, i, l) {
                while (i<l && ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789").indexOf(s.charAt(i)) != -1) {
                        i++;
                }
                return i;
        }
        function checkFirstLevelDomainChars(s, i, l) {
                while (i<l && ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").indexOf(s.charAt(i)) != -1) {
                        i++;
                }
                return (i == l);
        }
        trace(e);

        // every email starts with a string
        if ((i=checkFirstChars(e, 0, l)) == 0) {
                return -1;
        }
        //init j 
        j = i;

        // followed by an arbitrary number of ("." string) combinations
        while (i<l && e.charAt(i) == ".") {
                // skip the point
                i++;
                // if there are no chars, we have an error
                if ((j=checkChars(e, i, l)) == i) {
                        return -2;
                }
                // else skip the chars 
                i = j;
        }
        // then follows the magic @
        if (e.charAt(i) != "@") {
                return -3;
        }
        if (e.charAt(i+2) == ".") {
                return -3;
        }
        // followed by minimum one string point string 
        // after the last point minimum 2 characters are allowed

        do {
                // skip the @ (j == i at the beginning, so it is like i++)
                i = j+1;
                // do we have more chars ?
                j = checkChars(e, i, l);
                if (j == i) {
                        // no more chars found -> error
                        return -4;
                } else if (j == e.length) {
                        // emailaddress is finished, do we have a first level domain ?
                        j -= i;
                        // we have one if it is at least 2 long and consists of the correct characters
                        if (foundPoint && j>=2 && checkFirstLevelDomainChars(e, i, l) && j<=5) {
                                return 1;
                        } else {
                                return -5;
                        }
                }
                // if we reach the end or don't have a point, we return an error 
                foundPoint = (e.charAt(j) == ".");
        } while (i<l && foundPoint);
        return -6;
}
trace(checkEmail('ewer878@ss.com'));


wvxvw 04.06.2008 19:47

только indeхOf() очень медленная...
http://www.jurjans.lv/flash/RegExp.html вот отсюда можно взять regEхp для АС2.
Собственно, в моем варианте нужно было всего 1 строчку добавить =)
Код:

function validateEmail(s:String):Boolean {
        if(s.indexOf('..')>=0) return false;
        if(s.indexOf('@.')>=0) return false;
        var sl:Number = s.length;
        var i:Number = 0;
        var ss:Number;
        var isLocalName:Boolean = true;
        var domainName:Boolean = false;
        var domainZone1:Boolean = false;
        var domainZone2:Boolean = false;
       
        var hasDomainName:Boolean = false;
        var hasDomainZone:Boolean = false;
        while (i < sl) {
                ss = s.charCodeAt(i);
                //trace(ss);
                switch (ss) {
                        case -1:
                        case 33:
                        case 34:
                        case 35:
                        case 36:
                        case 38:
                        case 39:
                        case 40:
                        case 41:
                        case 42:
                        case 43:
                        case 47:
                        case 58:
                        case 59:
                        case 60:
                        case 61:
                        case 62:
                        case 63:
                        case 91:
                        case 92:
                        case 93:
                        case 123:
                        case 124:
                        case 125:
                                return false;
                        case 64:
                                if (!isLocalName || !i) return false;
                                isLocalName = false;
                                hasDomainName = true;
                                domainName = true;
                                break;
                        case 45:
                                if (!i) return false;
                                break;
                        case 46:
                                if (!i) return false;
                                if (isLocalName) break;
                                if (domainName) {
                                        domainName = false;
                                        hasDomainZone = true;
                                        domainZone1 = true;
                                } else if (domainZone1) {
                                        domainZone1 = false;
                                        domainZone2 = true;
                                } else {
                                        return false;
                                }
                                break;
                        default:
                                if (ss > 47 && ss < 122) {
                                        break;
                                } else {
                                        return false;
                                }
                }
                i++;
        }
        if (hasDomainName && hasDomainZone) return true;
        return false;
}
trace(validateEmail('abc.d12-3@hotmail.com'));

Вот, добавил еще тест, если интересно =)
Код:

function checkEmail(e) {
        var i, j, l = e.length;
        var foundPoint = false;

        function checkChars(s, i, l) {
                while (i<l && ("_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789").indexOf(s.charAt(i)) != -1) {
                        i++;
                }
                return i;
        }

        function checkFirstChars(s, i, l) {
                while (i<l && ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789").indexOf(s.charAt(i)) != -1) {
                        i++;
                }
                return i;
        }
        function checkFirstLevelDomainChars(s, i, l) {
                while (i<l && ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").indexOf(s.charAt(i)) != -1) {
                        i++;
                }
                return (i == l);
        }
        //trace(e);

        // every email starts with a string
        if ((i=checkFirstChars(e, 0, l)) == 0) {
                return -1;
        }
        //init j 
        j = i;

        // followed by an arbitrary number of ("." string) combinations
        while (i<l && e.charAt(i) == ".") {
                // skip the point
                i++;
                // if there are no chars, we have an error
                if ((j=checkChars(e, i, l)) == i) {
                        return -2;
                }
                // else skip the chars 
                i = j;
        }
        // then follows the magic @
        if (e.charAt(i) != "@") {
                return -3;
        }
        if (e.charAt(i+2) == ".") {
                return -3;
        }
        // followed by minimum one string point string 
        // after the last point minimum 2 characters are allowed

        do {
                // skip the @ (j == i at the beginning, so it is like i++)
                i = j+1;
                // do we have more chars ?
                j = checkChars(e, i, l);
                if (j == i) {
                        // no more chars found -> error
                        return -4;
                } else if (j == e.length) {
                        // emailaddress is finished, do we have a first level domain ?
                        j -= i;
                        // we have one if it is at least 2 long and consists of the correct characters
                        if (foundPoint && j>=2 && checkFirstLevelDomainChars(e, i, l) && j<=5) {
                                return 1;
                        } else {
                                return -5;
                        }
                }
                // if we reach the end or don't have a point, we return an error 
                foundPoint = (e.charAt(j) == ".");
        } while (i<l && foundPoint);
        return -6;
}
//
function validateEmail(s:String):Boolean {
        if(s.indexOf('..')>=0) return false;
        if(s.indexOf('@.')>=0) return false;
        var sl:Number = s.length;
        var i:Number = 0;
        var ss:Number;
        var isLocalName:Boolean = true;
        var domainName:Boolean = false;
        var domainZone1:Boolean = false;
        var domainZone2:Boolean = false;
       
        var hasDomainName:Boolean = false;
        var hasDomainZone:Boolean = false;
        while (i < sl) {
                ss = s.charCodeAt(i);
                //trace(ss);
                switch (ss) {
                        case -1:
                        case 33:
                        case 34:
                        case 35:
                        case 36:
                        case 38:
                        case 39:
                        case 40:
                        case 41:
                        case 42:
                        case 43:
                        case 47:
                        case 58:
                        case 59:
                        case 60:
                        case 61:
                        case 62:
                        case 63:
                        case 91:
                        case 92:
                        case 93:
                        case 123:
                        case 124:
                        case 125:
                                return false;
                        case 64:
                                if (!isLocalName || !i) return false;
                                isLocalName = false;
                                hasDomainName = true;
                                domainName = true;
                                break;
                        case 45:
                                if (!i) return false;
                                break;
                        case 46:
                                if (!i) return false;
                                if (isLocalName) break;
                                if (domainName) {
                                        domainName = false;
                                        hasDomainZone = true;
                                        domainZone1 = true;
                                } else if (domainZone1) {
                                        domainZone1 = false;
                                        domainZone2 = true;
                                } else {
                                        return false;
                                }
                                break;
                        default:
                                if (ss > 47 && ss < 122) {
                                        break;
                                } else {
                                        return false;
                                }
                }
                i++;
        }
        if(hasDomainName && hasDomainZone) return true;
        return false;
}
var eMails:Array = [];
function generateEmails():Void {
        var randChar:String = '';
        var emailLength:Number = 16;
        while(emailLength) {
                randChar += String.fromCharCode(Math.round(Math.random()*126));
                emailLength--;
        }
        eMails.push(randChar);
}
for(var t:Number=0; t<1000; t++){
        generateEmails();
}
var time:Number = getTimer();
for(var i:Number=0; i<1000; i++){
        validateEmail(eMails[i])
}
trace('validateEmail validated 1000 e-mails within '+(getTimer() - time)+' ms');
var time:Number = getTimer();
for(var j:Number=0; j<1000; j++){
        checkEmail(eMails[i])
}
trace('checkEmail validated 1000 e-mails within '+(getTimer() - time)+' ms');


Ведьмак 04.06.2008 20:55

2 wvxvw: не совсем одну )
- пропускает если домен второго уровня 1 буква
- пропускает если в домене первого уровня цифры и тире
- пропускет если домен первого уровня из одной буквы

))

вобщем, RegExp рулит ))

wvxvw 04.06.2008 21:00

А что, разве нельзя? =/
по спецификации еще и не такое можно вроде... =)
по крайней мере я знаю один домейн из одной буквы =)
http://www.d.co.il/
это желтые страницы наши... я верю что и почта у них с одной буквой...

Ну и злая шутка напоследок =)
Код:

var validateEmail:RegExp = /^[\x21 | \x23-\x27 | \x2A | \x2B | \x2D | \x2F | \x30-\x39 | \x3D | \x3F | \x41-\x5A | \x5E | \x5F | \x60-\x7E] [\x21 | \x23-\x27 | \x2A | \x2B | \x2D | \x2F | \x30-\x39 | \x3D | \x3F | \x41-\x5A | \x5E | \x5F | \x60-\x7E |(\.{1})]{1,64}? @ [\w|\d|\-]{2,}\.[\w{3}$ | \w{2}(\.\w{2}*)$]{2,}/x;


Часовой пояс GMT +4, время: 13:04.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.