Показать сообщение отдельно
Старый 04.06.2008, 19:47
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 5  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
только 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.