1. 程式人生 > >JavaScript筆記之表單和正則表示式

JavaScript筆記之表單和正則表示式

       正則表示式是一種對文字字串進行驗證和格式化的極其強大的方式。通過使用正則表示式,可以用一兩行JavaScript程式碼完成原本需要幾十行程式碼的複雜任務。

       正則表示式是一種特殊符號編寫的模式,描述一個或多個文字字串,常常被認為是程式設計中最棘手的部分之一,但是隻要把混亂的正則表示式分解成有意義的小塊,其語法並不難理解。

       下面的一個例子,是用正則表示式驗證電子郵件地址:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Email Validation</title>
	<link type="text/css" rel="stylesheet" href="script01.css" />
	<script type="text/javascript" src="script01.js"></script>
</head>
<body>
	<h2 align="center">Email Validation</h2>
	<form action="someAction.cgi">
		<p><label>Email Address:
		<input class="email" type="text" size="50" /></label></p>
		<p><input type="reset" /> <input type="submit" value="Submit" /></p>
	</form>
</body>
</html>


script01.css

body {
	color: #000;
	background-color: #FFF;
}

input.invalid {
	background-color: #FF9;
	border: 2px red inset;
}

label.invalid {
	color: #F00;
	font-weight: bold;
}


script01.js

window.onload = initForms;

function initForms() {
	for (var i=0; i< document.forms.length; i++) {
		document.forms[i].onsubmit = function() {return validForm();}
	}
}

function validForm() {
	var allGood = true;
	var allTags = document.getElementsByTagName("*");

	for (var i=0; i<allTags.length; i++) {
		if (!validTag(allTags[i])) {
			allGood = false;
		}
	}
	return allGood;

	function validTag(thisTag) {
		var outClass = "";
		var allClasses = thisTag.className.split(" ");
	
		for (var j=0; j<allClasses.length; j++) {
			outClass += validBasedOnClass(allClasses[j]) + " ";
		}
	
		thisTag.className = outClass;
	
		if (outClass.indexOf("invalid") > -1) {
			invalidLabel(thisTag.parentNode);
			thisTag.focus();
			if (thisTag.nodeName == "INPUT") {
				thisTag.select();
			}
			return false;
		}
		return true;
		
		function validBasedOnClass(thisClass) {
			var classBack = "";
		
			switch(thisClass) {
				case "":
				case "invalid":
					break;
				case "email":
					if (allGood && !validEmail(thisTag.value)) classBack = "invalid ";
				default:
					classBack += thisClass;
			}
			return classBack;
		}
				
		function validEmail(email) {
			var re = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;

return re.test(email); } function invalidLabel(parentTag) { if (parentTag.nodeName == "LABEL") { parentTag.className += " invalid"; } } } }


現在開始解釋紅色程式碼行:

      正則表示式總是以斜槓(/)開頭和結尾。

      脫字元(^)表示要使用這個表示式檢查以特定的字串開頭的字串。

      表示式\w表示任意單一字元,包括a~z、A~Z、0~9或下劃線。

      加號+表示要尋找前面條目的一次或多次出現。

      前圓括號(表示一個組。

      方括號[]用來表示可以出現其中任意一個字元,這個方括號內包含字元\.-,但是點號對於正則表示式是有特殊意義的,所以需要在它前面加上反斜槓\,這表示指的實際上是點號本身,而不是它的特殊意義。在特殊字串前面使用反斜槓稱為“對字元轉義”。

      問號?表示前面的條目可以不出現或出現一次。問號後再次使用\w+,表示點號或連字元後面必須有其他一些字元。

      後圓括號表示這個組結束了。在此後是一個星號*,表示前面的條目可以不出現或出現多次。

      @字元僅僅代表它本身,沒有任何其他意義。

      接下來再次使用\w+,表示域名必須以一個或多個a~z、A~Z、0~9或下劃線開頭。在此之後同樣是([\.-]?\w+)*,這表示電子郵件地址的字尾中允許有點號或連字元。

      然後,在一對圓括號中建立另一個組:\.\w{2,3},表示希望找到一個點號,後面跟著一些字元。花括號中的數字表示前面的條目可以出現2次或3次。

      最後正則表示式的末尾是一個美元符號$,表示匹配的字串必須在這裡結束。

      return re.test(email);這一行獲得前一步中定義的正則表示式,並使用test()方法驗證電子郵件的有效性。

      如果不用正則表示式,則要使用多出數十行的程式碼來完成相同的程式碼

function validEmail(email) {
			var invalidChars = " /:,;";
		
			if (email == "") {
				return false;
			}
			for (var k=0; k<invalidChars.length; k++) {
				var badChar = invalidChars.charAt(k);
				if (email.indexOf(badChar) > -1) {
					return false;
				}
			}
			var atPos = email.indexOf("@",1);
			if (atPos == -1) {
				return false;
			}
			if (email.indexOf("@",atPos+1) != -1) {
				return false;
			}
			var periodPos = email.indexOf(".",atPos);
			if (periodPos == -1) {	
				return false;
			}
			if (periodPos+3 > email.length)	{
				return false;
			}
			return true;
		}
		
		function invalidLabel(parentTag) {
			if (parentTag.nodeName == "LABEL") {
				parentTag.className += " invalid";
			}
		}
	}
} 

        由此可見使用正則表示式確實可以減少大量程式碼。

                                                                                                                           (源《JavaScript基礎教程》)