![]() |
|
||||||||||
|
|||||
|
[+1 22.07.07]
|
Господа, подскажите, как сделать нормлаьную развернутую проверку валидности ящика введенного в поле формы а AS2?
Проверить на точку, собаку, тире в начале, цифры в конце могу и сам )) Заранее все спасибо.. |
|
|||||
|
Modus ponens
|
Ого... кса, задача, хоть и банальная - небанальная, отнюдь (у меня есть, например, один почтовый ящик с которым вечно проблемы из-за грамотеев решивших, что в домейном имени низзя дефисы) =)
Во-первых: существует стандарт для е-маил аддрессов... но он очень много чего позволяет... например: "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'));
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 03.06.2008 в 23:06. |
|
|||||
|
Banned
[+5 15.02.09]
[++5 15.02.09] Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
|
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;
}
|
|
|||||
|
[+1 22.07.07]
|
Ого ) Сейчас попробую..
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'));
Последний раз редактировалось Ведьмак; 04.06.2008 в 18:37. |
|
|||||
|
Modus ponens
|
только 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');
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 04.06.2008 в 20:40. |
|
|||||
|
[+1 22.07.07]
|
2 wvxvw: не совсем одну )
- пропускает если домен второго уровня 1 буква - пропускает если в домене первого уровня цифры и тире - пропускет если домен первого уровня из одной буквы )) вобщем, RegExp рулит )) |
|
|||||
|
Modus ponens
|
А что, разве нельзя? =/
по спецификации еще и не такое можно вроде... =) по крайней мере я знаю один домейн из одной буквы =) 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;
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 04.06.2008 в 21:05. |
![]() |
![]() |
Часовой пояс GMT +4, время: 10:35. |
|
|
« Предыдущая тема | Следующая тема » |
|
|