24-6 q峈靰k

在 WSH 也可以使用通用表示法,此方式可以讓我們很快地在大量文字中間找到我們所要的資訊。下面這個範例,我們找出一個網頁的標題:

原始檔(regExp01.js):(灰色區域按兩下即可拷貝)
// 使用通用表示法抓出一個網頁的標題

// 讀取硬碟中的網頁
localFile="test.htm"
fso = new ActiveXObject("Scripting.FileSystemObject");
forReading=1, forWriting=2;
fid=fso.OpenTextFile(localFile, forReading);
contents=fid.ReadAll();
fid.Close();
//WScript.Echo(content);

// 執行通用運算式
myRegExp = /<title>(.*)<\/title>/i;
title = myRegExp.exec(contents);

// 顯示結果
WScript.Echo("網頁標題 = " + title[1]);
WScript.Echo("網頁標題 = " + RegExp.$1);

此程式碼會重從 test.htm 找出此網頁的標題,印出結果如下:

網頁標題 = 國立清華大學資訊工程學系 網頁標題 = 國立清華大學資訊工程學系 在上述範例中,title[1] 和 RegExp.$1 儲存相同的結果。以同樣的方式,我們也可以找出一個以 JScript 為主的 WSH 檔案的第一列註解,如下:

原始檔(regExp02.js):(灰色區域按兩下即可拷貝)
// 抓出 WSH 程式碼(JScript)的第一註解列

// 讀取此檔案
localFile=WScript.ScriptFullName;
fso = new ActiveXObject("Scripting.FileSystemObject");
forReading=1, forWriting=2;
fid=fso.OpenTextFile(localFile, forReading);
contents=fid.ReadAll();
fid.Close();
//WScript.Echo(content);

// 執行通用運算式
myRegExp = /\s*\/\/\s*(.*)/;
firstCommentLine = myRegExp.exec(contents);

// 印出結果
WScript.Echo("第一註解列 = " + firstCommentLine[1]);

印出結果是:

第一註解列 = 抓出 WSH 程式碼(JScript)的第一註解列 利用相同的方式,我們可以對範例目錄製作一個 index.asp 的檔案,可以即時地將每一個 js 檔案的第一列註解列印出來,形成一頁對 WSH 的所有 JScript 範例的列表和簡單說明,如下:

Example(index.asp):

上述範例的原始檔如下:

原始檔(index.asp):(灰色區域按兩下即可拷貝)
<%@language=JScript%>
<% title=Request.ServerVariables("SCRIPT_NAME") %>

<%
function getFirstComment(fileName){
	var fso = new ActiveXObject("Scripting.FileSystemObject");
	var fid=fso.OpenTextFile(fileName, 1);
	var line=fid.ReadLine();
	fid.Close();
	
	var pattern = /\s*\/\/\s*(.*)$/;
	var abc = pattern.exec(line);
	if (abc==null)
		return("");
	else
		return(RegExp.$1);	// 或是「return(abc[1]);」亦可
}

// List files in a given directory with a given extension
function fileList(directory, extension){
	fso = new ActiveXObject("Scripting.FileSystemObject");
	fd = fso.GetFolder(Server.MapPath(directory));
	fc = new Enumerator(fd.Files);
	fileNames=new Array();
	var i=0;
	for (; !fc.atEnd(); fc.moveNext()){
		fileName=fc.item()+"";
		items=fileName.split(".");
		ext=items[items.length-1];	// Get file extension
		if (arguments.length==2)
			if ((ext.toUpperCase()==extension.toUpperCase())||(ext.toLowerCase()==extension.toLowerCase()))
				fileNames[i++]=fileName;
		if (arguments.length==1)
			fileNames[i++]=fileName;
	}
	return(fileNames.sort());
}
%>
<html>
<head>
	<title><%=title%></title>
	<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
	<meta HTTP-EQUIV="Expires" CONTENT="0">
	<style>
		td {font-family: "標楷體", "helvetica,arial", "Tahoma"}
		A:link {text-decoration: none}
		A:hover {text-decoration: underline}
	</style>
</head>

<body background="/jang/graphics/background/yellow.gif">
<font face="標楷體">
<h2 align=center><%=title%></h2>
<hr>

<table border=1 align=center>
<tr>
<th>檔案名稱<th>說明<th>檔案大小(Bytes)<th>最後修改時間
<%
files=fileList(".", "js");
fso = new ActiveXObject("Scripting.FileSystemObject");
for (i=0; i<files.length; i++){
	f = fso.GetFile(files[i]);
	Response.write("<tr>");
	Response.write("<td><a href=\"" + f.Name + "\">" + f.Name + "</a></td>");
	Response.write("<td>" + getFirstComment(files[i]) + "&nbsp;</td>");
	Response.write("<td>" + f.Size + "</td>");
	Response.write("<td>" + f.DateLastModified + "</td>");
}
%>
</table>

<hr>

<script language="JavaScript">
document.write("Last updated on " + document.lastModified + ".")
</script>

<a href="/jang/sandbox/asp/lib/editfile.asp?FileName=<%=Request.ServerVariables("PATH_INFO")%>"><img align=right border=0 src="/jang/graphics/invisible.gif"></a>
</font>
</body>
</html>

我們也可以針對一段 HTML 的原始碼,進行連結網址和連結文字的抽取:

原始檔(linkExtraction01.js):(灰色區域按兩下即可拷貝)
// 從一段文字中,抽取連結文字與相關網址

content="<a href=\"url1\">text1</a> and <a href=\"url2\">text2</a> and \r\n<a href=\"url3\">text3</a>";
pattern=/<A(.*?)<\/A>/gi;
found=content.match(pattern);
pattern2=/<\s*A\s+HREF\s*=\s*"?(.*?)"?\s*>(.*?)<\s*\/\s*A\s*>/i;
for (i=0; i<found.length; i++){
	pattern2.exec(found[i]);
	WScript.Echo(found[i]+" ===> URL="+RegExp.$1+", TEXT="+RegExp.$2);
}

顯示結果如下:

<a href="url1">text1</a> ===> URL=url1, TEXT=text1 <a href="url2">text2</a> ===> URL=url2, TEXT=text2 <a href="url3">text3</a> ===> URL=url3, TEXT=text3 我們也可以針對一個網頁 test.htm 來抽取連結網址和連結文字:

原始檔(linkExtraction02.js):(灰色區域按兩下即可拷貝)
// 從一個檔案中,抽取連結文字與相關網址(功能不完全,可再改進!)

fileName="test.htm";
fso = new ActiveXObject("Scripting.FileSystemObject");
fid=fso.OpenTextFile(fileName, 1);
content=fid.ReadAll();
fid.Close();

pattern=/<A(.*?)<\/A>/gi;
found=content.match(pattern);
pattern2=/<\s*A\s+HREF\s*=\s*"?(.*?)"?\s*>(.*?)<\s*\/\s*A\s*>/i;
for (i=0; i<found.length; i++){
	pattern2.exec(found[i]);
	WScript.Echo(found[i]+" ===> URL="+RegExp.$1+", TEXT="+RegExp.$2);
}

顯示結果如下:

<a href="2001_need_teacher_c.doc" target="_blank">(中)</a> ===> URL=2001_need_teacher_c.doc" target="_blank, TEXT=(中) <a href="2001_need_teacher_e.doc" target="_blank">(英)</a> ===> URL=2001_need_teacher_e.doc" target="_blank, TEXT=(英) <a href="/intro.html"><img src="/icon/csbuild_8.jpg" lowsrc="/icon/csbuild_7b.jpg" border=0 alt="清華資訊簡史"></a> ===> URL=/intro.html, TEXT=<img src="/icon/csbuild_8.jpg" lowsrc="/icon/csbuild_7b.jpg" border=0 alt="清華資訊簡史"> <a href="Grading_report.doc">系所自我評鑑報告</a> ===> URL=Grading_report.doc, TEXT=系所自我評鑑報告 <a href="mailto:www@cs.nthu.edu.tw">意 見 與 指 教</a> ===> URL=mailto:www@cs.nthu.edu.tw, TEXT=意 見 與 指 教 <a href="/webteam">製 作 小 組</a> ===> URL=/webteam, TEXT=製 作 小 組 <a href="special.html"><font face="Arials">學 術 卓 越 & 社 區 關 懷</a> ===> URL=special.html, TEXT=<font face="Arials">學 術 卓 越 & 社 區 關 懷

Hint
在嘗試上述範例時,請記得要將程式碼 linkExtraction02.js 和網頁檔案 test.htm 放在同一個目錄。


JScript 程式設計與應用:用於單機的 WSH 環境