<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>summer_smile的博客</title>
<link>http://blogger.org.cn/blog/blog.asp?name=summer_smile</link>
<description>summer_smile的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[面试题，难]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=5247</link>
<author>summer_smile</author>
<pubDate>2005/4/24 0:49:23</pubDate>
<description><![CDATA[一、关于ms&nbsp;sql&nbsp;2000&nbsp; <BR><BR>1．&nbsp;服务器1&nbsp;上一个数据库server1.data1，data1中有一个表&nbsp;table1；服务器2&nbsp;上有一个数据库server2.data2，data2中有一个表&nbsp;table2，如何实现两个表之间的&nbsp;inner&nbsp;join？&nbsp; <BR>2.&nbsp;如果从&nbsp;ms&nbsp;sql&nbsp;数据库中用一个复杂的sql语句，提取一个表的所有字段名称、类型、约束？&nbsp; <BR>3．如何提取一个字段的所有约束名称？&nbsp; <BR>4．如何实现将文本文件存入img字段并读出？&nbsp; <BR>5．全文检索的实现，以及自定义二进制格式文件存入img字段后如何实现全文检索？&nbsp;6．同一数据表中，不同记录之间的约束关系检查的实施方法。&nbsp; <BR><BR>二&nbsp;关于.net编程&nbsp; <BR><BR>1．.net组件在ie浏览器端嵌入，显示一个界面，.net组件与javascript脚本的交互，实现.net组件调用javascript函数，javascript调用.net公共属性和事件。&nbsp; <BR>2．&nbsp;.net插件在客户端的自动部署，包括自动下载和安全性自动设置。&nbsp; <BR>3．&nbsp;如何实现&nbsp;.net对win32&nbsp;api的调用，请在一个panel上生成、显示&nbsp;caret。&nbsp; <BR>4.&nbsp;如何从&nbsp;webservice&nbsp;中取得用户的&nbsp;sessionid？ <BR>5.&nbsp;如何通过&nbsp;webservice&nbsp;启动或调用服务器端的&nbsp;win&nbsp;service，安全机制的实现方式？&nbsp; <BR>6．用.net生成一个pdf文档。&nbsp; <BR>7．如何从&nbsp;1.aspx中将大数据传给&nbsp;2.aspx，且不能使用&nbsp;seesion&nbsp;和application？&nbsp; <BR><BR>三、关于javascript&nbsp; <BR><BR>1.&nbsp;能否改写一种基于&nbsp;javascript&nbsp;的网页中内置的简单字处理控件？&nbsp; <BR>2.&nbsp;在网页上动态生成菜单。&nbsp; <BR>3．xml&nbsp;+&nbsp;xsl定制网页。&nbsp; <BR>4．&nbsp;在网页中通过&nbsp;script&nbsp;调用&nbsp;word，excel，并将服务器端的数据传入到&nbsp;word和excel中？ <BR><BR><BR><BR><BR><BR>其实不难，可能大家想的过于复杂。我就是那次招聘进去的，这些问题都是实际要用的！ <BR><BR>我拿到的时候第一感觉也是bt的难度,1/3没问题,1/3找找也没问题,1/3很难,但是我仔细找了很久,请教了一些高手,最后基本搞定.也许做程序还是要杜绝浮躁吧!! <BR><BR>我当时的部分解答如下，请大家指正！ <BR><BR><BR>一、关于ms&nbsp;sql&nbsp;2000&nbsp; <BR>1．&nbsp;服务器1&nbsp;上一个数据库server1.data1，data1中有一个表&nbsp;table1；服务器2&nbsp;上有一个数据库server2.data2，data2中有一个表&nbsp;table2，如何实现两个表之间的&nbsp;inner&nbsp;join？&nbsp; <BR><BR>SELECT&nbsp;c.*,&nbsp;o.*&nbsp;&nbsp; <BR>FROM&nbsp;&nbsp;ISystem.dbo.info_data&nbsp;AS&nbsp;c&nbsp;INNER&nbsp;JOIN&nbsp; <BR>OPENROWSET('MSDASQL','DRIVER={SQL&nbsp;Server};SERVER=192.168.0.94;UID=sa;PWD=pop',&nbsp;ISystem.dbo.info_data)&nbsp;&nbsp;&nbsp;&nbsp;AS&nbsp;o <BR>&nbsp;&nbsp;&nbsp;ON&nbsp;c.ID&nbsp;=&nbsp;o.ID <BR>还有几种其他做法 <BR><BR>2.&nbsp;如果从&nbsp;ms&nbsp;sql&nbsp;数据库中用一个复杂的sql语句，提取一个表的所有字段名称、类型、约束？&nbsp; <BR><BR>select&nbsp;syscolumns.name, <BR>systypes.name&nbsp; <BR>from&nbsp;(syscolumns&nbsp;inner&nbsp;join&nbsp;sysobjects&nbsp;on&nbsp;syscolumns.id=sysobjects.id)&nbsp;,systypes&nbsp;&nbsp; <BR>where&nbsp;sysobjects.name&nbsp;='pxzx'&nbsp;and&nbsp;sysobjects.xtype='u'&nbsp;&nbsp; <BR>and&nbsp;syscolumns.xtype=systypes.xtype <BR>union&nbsp; <BR>select&nbsp;sysobjects.name, <BR>'约束'&nbsp; &nbsp; <BR>from&nbsp;sysobjects&nbsp; <BR>where&nbsp;sysobjects.xtype='c'&nbsp; <BR>and&nbsp;&nbsp;sysobjects.parent_obj= <BR>(select&nbsp;id&nbsp;from&nbsp;sysobjects&nbsp;&nbsp;where&nbsp;name&nbsp;='pxzx') <BR>3．如何提取一个字段的所有约束名称？&nbsp; <BR><BR>--提取字段的全部约束名 <BR>Select&nbsp;sysobjects.name <BR>from&nbsp;syscomments&nbsp;inner&nbsp;join&nbsp;sysobjects&nbsp;on&nbsp;&nbsp;syscomments.id=sysobjects.id <BR>where&nbsp;text&nbsp;like&nbsp;'%字段名%'&nbsp;and&nbsp;sysobjects.xtype='c' <BR><BR>4．如何实现将文本文件存入img字段并读出？&nbsp; <BR>文本文件存入时直接写入img字段即可; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果内容不是很长,读出转两次类型就可以了 <BR><BR><BR>5．全文检索的实现，以及自定义二进制格式文件存入img字段后如何实现全文检索？&nbsp; <BR><BR>在给定数据库中执行全文检索涉及到以下这些任务：&nbsp; <BR>标识要注册进行全文检索的表和列。&nbsp; <BR>索引注册了的列的数据，并用非无关单词填充全文索引。 <BR>对注册了的列查询填充的全文索引。 <BR>应确保后来对注册列中数据的更改能够传播到索引，以此保持全文索引与数据的同步。&nbsp; <BR><BR>可以创建自定义筛选用于自定义二进制格式文件存入img字段的全文索引。创建自定义筛选过程如下: <BR>描述筛选结构 <BR>实现和输出dll&nbsp;入口点 <BR>实现筛选类和Class&nbsp;Factory <BR>继承com接口 <BR>实现com接口方法 <BR><BR><BR><BR>6．同一数据表中，不同记录之间的约束关系检查的实施方法。&nbsp; <BR><BR>DBCC&nbsp;&nbsp;CHECKCONSTRAINTS <BR><BR>二&nbsp;关于.net编程&nbsp; <BR>1．&nbsp;.net组件在ie浏览器端嵌入，显示一个界面，.net组件与javascript脚本的交互，实现.net组件调用javascript函数，javascript调用.net公共属性和事件。 <BR>&nbsp;javascript直接从.net中输出,后者利用&lt;object&gt;标签即可... <BR>&nbsp; <BR><BR>2．&nbsp;.net插件在客户端的自动部署，包括自动下载和安全性自动设置。 <BR>可以生成一个ocx控件,同样用到利用&lt;object&gt;标签,再用相关软件生成证书&nbsp;来部署 <BR><BR>3．&nbsp;如何实现&nbsp;.net对win32&nbsp;api的调用，请在一个panel上生成、显示&nbsp;caret。&nbsp; <BR><BR>C＃中使用的类库都是托管代码（Managed&nbsp;Code）文件，而Win32的API函数所处的文件，都是非托管代码（Unmanaged&nbsp;Code）文件。这就导致了在C＃中不可能直接使用这些非托管代码文件中的函数。好在.Net框架为了保持对下的兼容，也为了充分利用以前的资源，提出了互操作，通过互操作可以实现对Win32的API函数的调用。互操作不仅适用于Win32的API函数，还可以用来访问托管的COM对象。C＃中对Win32的API函数的互操作是通过命名空间“System.Runtime.InteropServices”中的“DllImport”特征类来实现的。它的主要作用是指示此属性化方法是作为非托管DLL的输出实现的。 <BR><BR>4.&nbsp;如何从&nbsp;webservice&nbsp;中取得用户的&nbsp;sessionid？&nbsp; <BR>[WebMethod(EnableSession=true)] <BR>public&nbsp;string&nbsp;&nbsp;GetID() <BR>{ <BR>return&nbsp;Session.SessionID; <BR>} <BR><BR>5.&nbsp;如何通过&nbsp;webservice&nbsp;启动或调用服务器端的&nbsp;win&nbsp;service，安全机制的实现方式？&nbsp; <BR>引用：System.ServiceProcess命名空间，可以通过ServiceController&nbsp;类连接到正在运行或者已停止的服务、对其进行操作或获取有关它的信息 <BR>using&nbsp;System.ServiceProcess; <BR>……. <BR>[WebMethod] <BR>public&nbsp;string&nbsp;getSerInfo() <BR>{ <BR>ServiceController&nbsp;sc2&nbsp;=&nbsp;new&nbsp;ServiceController("Telnet"); <BR>if&nbsp;(sc2.Status.Equals(ServiceControllerStatus.Stopped)) <BR>{ <BR>return&nbsp;"Stopped"&nbsp;; <BR>} <BR>else <BR>{ <BR>return&nbsp;"started"; <BR>} <BR>} <BR>安全机制需要从web&nbsp;services&nbsp;方面着手，亦即身份验证和授权； <BR><BR>6．用.net生成一个pdf文档。&nbsp; <BR>已经实现,代码太长 <BR><BR>7．如何从&nbsp;1.aspx中将大数据传给&nbsp;2.aspx，且不能使用&nbsp;seesion&nbsp;和application？ <BR><BR>在Form域中过去:&nbsp;对于一个需要发送大数据的域，在提交表单前将数据拆分为小于限额的数份，分别放在数个hidden域中，同时把原有域清空，再正式提交表单。服务器端还是用Request.Form()读取各hidden域的数据，再按照顺序把他们拼接起来就行了。 <BR><BR>或是server.transfer,传一个public&nbsp;class过去 <BR><BR>&nbsp;三、关于javascript&nbsp; <BR>1.&nbsp;能否改写一种基于&nbsp;javascript&nbsp;的网页中内置的简单字处理控件？&nbsp; <BR>曾经改写过 <BR><BR>2.&nbsp;在网页上动态生成菜单。&nbsp; <BR>so&nbsp;easy <BR><BR>3．xml&nbsp;+&nbsp;xsl定制网页。&nbsp; <BR><BR>so&nbsp;easy <BR><BR>4．&nbsp;在网页中通过&nbsp;script&nbsp;调用&nbsp;word，excel，并将服务器端的数据传入到&nbsp;word和excel中？ <BR>&nbsp;用javascript可以实现类似web&nbsp;service的功能,用到Microsoft.XMLHTTP这个ActiveXObject <BR>]]></description>
</item><item>
<title><![CDATA[如何从HTM文件中提取文本？]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=5246</link>
<author>summer_smile</author>
<pubDate>2005/4/24 0:44:12</pubDate>
<description><![CDATA[Public Function StripText(Path As String, FileName As String, ExpandName As String) As String<BR>Dim f, ff, is_tag, write2file, i<BR>Dim strTemp As String<BR>Dim t As String<BR>On Error Resume Next<BR>f = FreeFile<BR>Open Path &amp; FileName &amp; "." &amp; ExpandName For Input As #f ' Open the HTML file in read mode<BR>strTemp = GetTempFile("txt"): StripText = strTemp<BR>ff = FreeFile<BR>Open strTemp For Output As #ff<BR>Do While Not EOF(f)<BR>Line Input #f, t<BR>write2file = ""<BR>For i = 1 To Len(t)<BR>Select Case Mid(t, i, 1)<BR>Case "&lt;"<BR>is_tag = True<BR>Case "&gt;"<BR>is_tag = False<BR>Case Else<BR>If Not is_tag Then write2file = write2file &amp; Mid(t, i, 1)<BR>End Select<BR>Next<BR>Print #ff, write2file<BR>Loop<BR>Close ff<BR>Close f<BR>Close f <!--mstheme--><!--msnavigation--><!--msnavigation-->]]></description>
</item><item>
<title><![CDATA[简介]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=5245</link>
<author>summer_smile</author>
<pubDate>2005/4/24 0:36:58</pubDate>
<description><![CDATA[
<FORM language=javascript id=Form1 name=Form1 onsubmit="if (!ValidatorOnSubmit()) return false;" action=27184.html method=post><INPUT type=hidden name=__EVENTTARGET> <INPUT type=hidden name=__EVENTARGUMENT> <INPUT type=hidden name=__VIEWSTATE>
<SCRIPT language=javascript type=text/javascript>
<!--
	function __doPostBack(eventTarget, eventArgument) {
		var theform;
		if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
			theform = document.Form1;
		}
		else {
			theform = document.forms["Form1"];
		}
		theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
		theform.__EVENTARGUMENT.value = eventArgument;
		theform.submit();
	}
// -->
</SCRIPT>

<SCRIPT language=JavaScript>
									function ctlent()
											{
												if(event.ctrlKey && event.keyCode == 13)
												{	
													try
													{
														TempSave('AnonymousPostComment1_tbComment');
													}
													catch(ex)
													{
													}
													finally
													{
													__doPostBack('AnonymousPostComment1:btnSubmit','')
													}
												}
		
												}</SCRIPT>

<SCRIPT language=javascript>

function cb_vefify() {
var val = document.all["PostRate1_rbtRate"];
var col = val.all;
if ( col != null ) {
for ( i = 0; i < col.length; i++ ) {
if (col.item(i).tagName == "INPUT") {
if ( col.item(i).checked ) {

return true;
}
}
}


 alert('请选择一个分值');return false;
}
}
</SCRIPT>

<SCRIPT language=javascript src="/aspnet_client/system_web/1_1_4322/WebUIValidation.js" type=text/javascript></SCRIPT>
 
<TABLE class=Framework cellSpacing=0 cellPadding=0 width="100%">
<TBODY>
<TR>
<TD colSpan=3>
<DIV id=top>
<TABLE cellSpacing=0 cellPadding=10 width="100%">
<TBODY>
<TR>
<TD noWrap>
<H1><A class=headermaintitle id=Header1_HeaderTitle href="http://www.cnblogs.com/dudu/">dudu</A></H1>享受编程的快乐 </TD></TR></TBODY></TABLE></DIV>
<DIV id=sub>
<DIV id=sub-right>
<DIV class=BlogStats>posts - 466, comments - 3907, trackbacks - 23, articles - 101</DIV></DIV>&nbsp; <A id=Header1_MyLinks1_HomeLink href="http://www.cnblogs.com/">博客园</A>&nbsp;:: <A id=Header1_MyLinks1_MyHomeLink href="http://www.cnblogs.com/dudu/">首页</A>&nbsp;:: <A id=Header1_MyLinks1_NewPostLink href="http://www.cnblogs.com/dudu/admin/EditPosts.aspx?opt=1">新随笔</A>&nbsp;:: <A id=Header1_MyLinks1_ContactLink accessKey=9 href="http://www.cnblogs.com/dudu/contact.aspx">联系</A>&nbsp;:: <A id=Header1_MyLinks1_Syndication href="http://www.cnblogs.com/dudu/Rss.aspx">聚合</A> <A class=XMLLink id=Header1_MyLinks1_XMLLink href="http://www.cnblogs.com/dudu/Rss.aspx"><IMG alt="" src="http://www.cnblogs.com/Skins/KJC/images/xml.gif" border=0></A>&nbsp;:: <A id=Header1_MyLinks1_Admin href="http://www.cnblogs.com/login.aspx?ReturnURL=http://www.cnblogs.com/dudu/admin/default.aspx&amp;SourceUrl=/dudu/articles/27184.html&amp;Blog=dudu">登录</A> </DIV></TD></TR>
<TR>
<TD class=LeftCell>
<DIV id=leftmenu>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>公告</H3>
<UL>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;人生的真正价值在于从何种程度与何种意义上摆脱自我! 
<LI>&nbsp;&nbsp;<A href="http://member.bcentral.com/cgi-bin/fc/fastcounter-login?3368966" target=_top> <IMG src="http://fastcounter.bcentral.com/fastcounter?3368966+6737939" border=0></A> </LI></UL></DIV>
<UL>
<LI>
<DIV id=cnblogsgooglead width="180" height="150"><IFRAME name=google_ads_frame marginWidth=0 marginHeight=0 src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-4210569241504288&amp;dt=1114274098343&amp;lmt=1114274098&amp;format=180x150_as&amp;output=html&amp;url=http%3A%2F%2Fwww.cnblogs.com%2Fdudu%2Farticles%2F27184.html&amp;ad_type=text&amp;ref=http%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3D%25E6%25AD%25A3%25E5%2588%2599%25E8%25A1%25A8%25E8%25BE%25BE%25E5%25BC%258F%2B%25E7%25BD%2591%25E9%25A1%25B5%25E6%2596%2587%25E6%259C%25AC%26hl%3Dzh-CN%26lr%3D%26newwindow%3D1%26start%3D30%26sa%3DN&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_java=true" frameBorder=0 width=180 scrolling=no height=150 allowTransparency><img height="1" width="1" border="0" src="http://pagead2.googlesyndication.com/pagead/imp.gif?event=noiframe&client=ca-pub-4210569241504288&dt=1114274098343&lmt=1114274098&format=180x150_as&output=html&url=http%3A%2F%2Fwww.cnblogs.com%2Fdudu%2Farticles%2F27184.html&ad_type=text&ref=http%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3D%25E6%25AD%25A3%25E5%2588%2599%25E8%25A1%25A8%25E8%25BE%25BE%25E5%25BC%258F%2B%25E7%25BD%2591%25E9%25A1%25B5%25E6%2596%2587%25E6%259C%25AC%26hl%3Dzh-CN%26lr%3D%26newwindow%3D1%26start%3D30%26sa%3DN&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_java=true" /></IFRAME></DIV>
<DIV id=cnblogsgoogleadcode style="DISPLAY: none">
<SCRIPT type=text/javascript><!--
google_ad_client = "pub-4210569241504288";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_channel ="";
google_ad_type = "text";
//--></SCRIPT>

<SCRIPT src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
</SCRIPT>
<IFRAME name=google_ads_frame marginWidth=0 marginHeight=0 src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-4210569241504288&amp;dt=1114274098343&amp;lmt=1114274098&amp;format=180x150_as&amp;output=html&amp;url=http%3A%2F%2Fwww.cnblogs.com%2Fdudu%2Farticles%2F27184.html&amp;ad_type=text&amp;ref=http%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3D%25E6%25AD%25A3%25E5%2588%2599%25E8%25A1%25A8%25E8%25BE%25BE%25E5%25BC%258F%2B%25E7%25BD%2591%25E9%25A1%25B5%25E6%2596%2587%25E6%259C%25AC%26hl%3Dzh-CN%26lr%3D%26newwindow%3D1%26start%3D30%26sa%3DN&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_java=true" frameBorder=0 width=180 scrolling=no height=150 allowTransparency><img height="1" width="1" border="0" src="http://pagead2.googlesyndication.com/pagead/imp.gif?event=noiframe&client=ca-pub-4210569241504288&dt=1114274098343&lmt=1114274098&format=180x150_as&output=html&url=http%3A%2F%2Fwww.cnblogs.com%2Fdudu%2Farticles%2F27184.html&ad_type=text&ref=http%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3D%25E6%25AD%25A3%25E5%2588%2599%25E8%25A1%25A8%25E8%25BE%25BE%25E5%25BC%258F%2B%25E7%25BD%2591%25E9%25A1%25B5%25E6%2596%2587%25E6%259C%25AC%26hl%3Dzh-CN%26lr%3D%26newwindow%3D1%26start%3D30%26sa%3DN&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_java=true" /></IFRAME></DIV></LI></UL>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>留言簿</H3>
<UL>
<LI><A id=Singlecolumn2__e6510af34d49796b_lnkMessages href="http://www.cnblogs.com/dudu/Contact.aspx?id=1">给我留言</A> 
<LI><A id=Singlecolumn2__e6510af34d49796b_lnkPublicMsgView href="http://www.cnblogs.com/dudu/default.aspx?opt=msg">查看公开留言</A> 
<LI><A id=Singlecolumn2__e6510af34d49796b_lnkPrivateMsgView href="http://www.cnblogs.com/dudu/admin/MyMessages.aspx">查看私人留言</A> </LI></UL></DIV><!--<div id=cell>
<img src="images/searchico.jpg" hspace=5 align=left vspace=2><h3>Search</h3>
<div style="padding: 10 0 5 5"><input name="Singlecolumn2:Categories:search" type="text" id="Singlecolumn2_Categories_search" style="width:100px;" /> <input type="submit" name="Singlecolumn2:Categories:btnSearch" value="Search" onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="Singlecolumn2_Categories_btnSearch" /></div>
</div>-->
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>随笔分类</H3>
<UL>
<LI><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl1_RssLink title="Subscribe to .Text相关&amp;nbsp;(9)" href="http://www.cnblogs.com/dudu/category/600.html/rss"><IMG title="Subscribe to .Text相关&amp;nbsp;(9)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl1_Link href="http://www.cnblogs.com/dudu/category/600.html">.Text相关&nbsp;(9)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl2_RssLink title="Subscribe to ASP.NET&amp;nbsp;(12)" href="http://www.cnblogs.com/dudu/category/404.html/rss"><IMG title="Subscribe to ASP.NET&amp;nbsp;(12)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl2_Link href="http://www.cnblogs.com/dudu/category/404.html">ASP.NET&nbsp;(12)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl3_RssLink title="Subscribe to C#&amp;nbsp;(13)" href="http://www.cnblogs.com/dudu/category/587.html/rss"><IMG title="Subscribe to C#&amp;nbsp;(13)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl3_Link href="http://www.cnblogs.com/dudu/category/587.html">C#&nbsp;(13)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl4_RssLink title="Subscribe to CLR&amp;nbsp;(1)" href="http://www.cnblogs.com/dudu/category/2388.html/rss"><IMG title="Subscribe to CLR&amp;nbsp;(1)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl4_Link href="http://www.cnblogs.com/dudu/category/2388.html">CLR&nbsp;(1)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl5_RssLink title="Subscribe to CN.Text开发笔记&amp;nbsp;(4)" href="http://www.cnblogs.com/dudu/category/9932.html/rss"><IMG title="Subscribe to CN.Text开发笔记&amp;nbsp;(4)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl5_Link href="http://www.cnblogs.com/dudu/category/9932.html">CN.Text开发笔记&nbsp;(4)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl6_RssLink title="Subscribe to SharePoint&amp;nbsp;(13)" href="http://www.cnblogs.com/dudu/category/14540.html/rss"><IMG title="Subscribe to SharePoint&amp;nbsp;(13)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl6_Link href="http://www.cnblogs.com/dudu/category/14540.html">SharePoint&nbsp;(13)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl7_RssLink title="Subscribe to 技术转载&amp;nbsp;(2)" href="http://www.cnblogs.com/dudu/category/21812.html/rss"><IMG title="Subscribe to 技术转载&amp;nbsp;(2)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl7_Link href="http://www.cnblogs.com/dudu/category/21812.html">技术转载&nbsp;(2)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl8_RssLink title="Subscribe to 生活随笔&amp;nbsp;(1)" href="http://www.cnblogs.com/dudu/category/20412.html/rss"><IMG title="Subscribe to 生活随笔&amp;nbsp;(1)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl8_Link href="http://www.cnblogs.com/dudu/category/20412.html">生活随笔&nbsp;(1)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl9_RssLink title="Subscribe to 书籍&amp;nbsp;(1)" href="http://www.cnblogs.com/dudu/category/20156.html/rss"><IMG title="Subscribe to 书籍&amp;nbsp;(1)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl9_Link href="http://www.cnblogs.com/dudu/category/20156.html">书籍&nbsp;(1)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl10_RssLink title="Subscribe to 网站功能说明&amp;nbsp;(58)" href="http://www.cnblogs.com/dudu/category/209.html/rss"><IMG title="Subscribe to 网站功能说明&amp;nbsp;(58)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl10_Link href="http://www.cnblogs.com/dudu/category/209.html">网站功能说明&nbsp;(58)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl11_RssLink title="Subscribe to 网站管理&amp;nbsp;(77)" href="http://www.cnblogs.com/dudu/category/4034.html/rss"><IMG title="Subscribe to 网站管理&amp;nbsp;(77)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl11_Link href="http://www.cnblogs.com/dudu/category/4034.html">网站管理&nbsp;(77)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl12_RssLink title="Subscribe to 维护经验&amp;nbsp;(9)" href="http://www.cnblogs.com/dudu/category/838.html/rss"><IMG title="Subscribe to 维护经验&amp;nbsp;(9)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl0_LinkList__ctl12_Link href="http://www.cnblogs.com/dudu/category/838.html">维护经验&nbsp;(9)</A> </LI></UL></DIV>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>随笔档案</H3>
<UL>
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl1_Link href="http://www.cnblogs.com/dudu/archive/2005/04.html">2005年4月 (21)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl2_Link href="http://www.cnblogs.com/dudu/archive/2005/03.html">2005年3月 (32)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl3_Link href="http://www.cnblogs.com/dudu/archive/2005/02.html">2005年2月 (19)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl4_Link href="http://www.cnblogs.com/dudu/archive/2005/01.html">2005年1月 (23)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl5_Link href="http://www.cnblogs.com/dudu/archive/2004/12.html">2004年12月 (35)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl6_Link href="http://www.cnblogs.com/dudu/archive/2004/11.html">2004年11月 (24)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl7_Link href="http://www.cnblogs.com/dudu/archive/2004/10.html">2004年10月 (19)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl8_Link href="http://www.cnblogs.com/dudu/archive/2004/09.html">2004年9月 (26)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl9_Link href="http://www.cnblogs.com/dudu/archive/2004/08.html">2004年8月 (35)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl10_Link href="http://www.cnblogs.com/dudu/archive/2004/07.html">2004年7月 (30)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl11_Link href="http://www.cnblogs.com/dudu/archive/2004/06.html">2004年6月 (24)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl12_Link href="http://www.cnblogs.com/dudu/archive/2004/05.html">2004年5月 (17)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl13_Link href="http://www.cnblogs.com/dudu/archive/2004/04.html">2004年4月 (9)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl14_Link href="http://www.cnblogs.com/dudu/archive/2004/03.html">2004年3月 (58)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl15_Link href="http://www.cnblogs.com/dudu/archive/2004/02.html">2004年2月 (62)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl1_LinkList__ctl16_Link href="http://www.cnblogs.com/dudu/archive/2004/01.html">2004年1月 (32)</A> </LI></UL></DIV>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>文章分类</H3>
<UL>
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl1_RssLink title="Subscribe to AOP&amp;nbsp;(9)" href="http://www.cnblogs.com/dudu/category/1189.html/rss"><IMG title="Subscribe to AOP&amp;nbsp;(9)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl1_Link href="http://www.cnblogs.com/dudu/category/1189.html">AOP&nbsp;(9)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl2_RssLink title="Subscribe to ASP.NET&amp;nbsp;(24)" href="http://www.cnblogs.com/dudu/category/15.html/rss"><IMG title="Subscribe to ASP.NET&amp;nbsp;(24)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl2_Link href="http://www.cnblogs.com/dudu/category/15.html">ASP.NET&nbsp;(24)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl3_RssLink title="Subscribe to Blog技术&amp;nbsp;(3)" href="http://www.cnblogs.com/dudu/category/182.html/rss"><IMG title="Subscribe to Blog技术&amp;nbsp;(3)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl3_Link href="http://www.cnblogs.com/dudu/category/182.html">Blog技术&nbsp;(3)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl4_RssLink title="Subscribe to CLR&amp;nbsp;(4)" href="http://www.cnblogs.com/dudu/category/2252.html/rss"><IMG title="Subscribe to CLR&amp;nbsp;(4)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl4_Link href="http://www.cnblogs.com/dudu/category/2252.html">CLR&nbsp;(4)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl5_RssLink title="Subscribe to CVS&amp;nbsp;(3)" href="http://www.cnblogs.com/dudu/category/1469.html/rss"><IMG title="Subscribe to CVS&amp;nbsp;(3)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl5_Link href="http://www.cnblogs.com/dudu/category/1469.html">CVS&nbsp;(3)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl6_RssLink title="Subscribe to Enterprise Architecture&amp;nbsp;(1)" href="http://www.cnblogs.com/dudu/category/18917.html/rss"><IMG title="Subscribe to Enterprise Architecture&amp;nbsp;(1)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl6_Link href="http://www.cnblogs.com/dudu/category/18917.html">Enterprise Architecture&nbsp;(1)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl7_RssLink title="Subscribe to JGTM文章收藏&amp;nbsp;(4)" href="http://www.cnblogs.com/dudu/category/1217.html/rss"><IMG title="Subscribe to JGTM文章收藏&amp;nbsp;(4)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl7_Link href="http://www.cnblogs.com/dudu/category/1217.html">JGTM文章收藏&nbsp;(4)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl8_RssLink title="Subscribe to NUnit&amp;nbsp;(2)" href="http://www.cnblogs.com/dudu/category/332.html/rss"><IMG title="Subscribe to NUnit&amp;nbsp;(2)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl8_Link href="http://www.cnblogs.com/dudu/category/332.html">NUnit&nbsp;(2)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl9_RssLink title="Subscribe to SharePoint&amp;nbsp;(14)" href="http://www.cnblogs.com/dudu/category/10399.html/rss"><IMG title="Subscribe to SharePoint&amp;nbsp;(14)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl9_Link href="http://www.cnblogs.com/dudu/category/10399.html">SharePoint&nbsp;(14)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl10_RssLink title="Subscribe to 博客堂收藏&amp;nbsp;(6)" href="http://www.cnblogs.com/dudu/category/453.html/rss"><IMG title="Subscribe to 博客堂收藏&amp;nbsp;(6)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl10_Link href="http://www.cnblogs.com/dudu/category/453.html">博客堂收藏&nbsp;(6)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl11_RssLink title="Subscribe to 博客园FAQ&amp;nbsp;(0)" href="http://www.cnblogs.com/dudu/category/6235.html/rss"><IMG title="Subscribe to 博客园FAQ&amp;nbsp;(0)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl11_Link href="http://www.cnblogs.com/dudu/category/6235.html">博客园FAQ&nbsp;(0)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl12_RssLink title="Subscribe to 博客园建设&amp;nbsp;(2)" href="http://www.cnblogs.com/dudu/category/16301.html/rss"><IMG title="Subscribe to 博客园建设&amp;nbsp;(2)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl12_Link href="http://www.cnblogs.com/dudu/category/16301.html">博客园建设&nbsp;(2)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl13_RssLink title="Subscribe to 设计模式&amp;nbsp;(1)" href="http://www.cnblogs.com/dudu/category/376.html/rss"><IMG title="Subscribe to 设计模式&amp;nbsp;(1)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl13_Link href="http://www.cnblogs.com/dudu/category/376.html">设计模式&nbsp;(1)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl14_RssLink title="Subscribe to 在读文章&amp;nbsp;(1)" href="http://www.cnblogs.com/dudu/category/10262.html/rss"><IMG title="Subscribe to 在读文章&amp;nbsp;(1)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl14_Link href="http://www.cnblogs.com/dudu/category/10262.html">在读文章&nbsp;(1)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl15_RssLink title="Subscribe to 正则表达式&amp;nbsp;(5)" href="http://www.cnblogs.com/dudu/category/338.html/rss"><IMG title="Subscribe to 正则表达式&amp;nbsp;(5)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl2_LinkList__ctl15_Link href="http://www.cnblogs.com/dudu/category/338.html">正则表达式&nbsp;(5)</A> </LI></UL></DIV>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>相册</H3>
<UL>
<LI><A id=Singlecolumn2_Categories_CatList__ctl3_LinkList__ctl1_Link href="http://www.cnblogs.com/dudu/gallery/21972.html">书籍&nbsp;(1)</A> </LI></UL></DIV>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>收藏夹</H3>
<UL>
<LI><A id=Singlecolumn2_Categories_CatList__ctl4_LinkList__ctl1_RssLink title="Subscribe to 博客园文章&amp;nbsp;(42)" href="http://www.cnblogs.com/dudu/favorite/240.html/rss"><IMG title="Subscribe to 博客园文章&amp;nbsp;(42)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl4_LinkList__ctl1_Link href="http://www.cnblogs.com/dudu/favorite/240.html">博客园文章&nbsp;(42)</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl4_LinkList__ctl2_RssLink title="Subscribe to 其他网站&amp;nbsp;(23)" href="http://www.cnblogs.com/dudu/favorite/264.html/rss"><IMG title="Subscribe to 其他网站&amp;nbsp;(23)" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl4_LinkList__ctl2_Link href="http://www.cnblogs.com/dudu/favorite/264.html">其他网站&nbsp;(23)</A> </LI></UL></DIV>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>.NET站点</H3>
<UL>
<LI><A id=Singlecolumn2_Categories_CatList__ctl5_LinkList__ctl1_RssLink title="Subscribe to .NET Languages" href="http://www.dotnetlanguages.net/DNL/Rss.aspx"><IMG title="Subscribe to .NET Languages" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl5_LinkList__ctl1_Link href="http://www.dotnetlanguages.net/DNL/Default.aspx">.NET Languages</A> </LI></UL></DIV>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>SharePoint站点</H3>
<UL>
<LI><A id=Singlecolumn2_Categories_CatList__ctl6_LinkList__ctl1_Link href="http://andrewconnell.com/blog">andrew connell</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl6_LinkList__ctl2_Link href="http://weblogs.asp.net/arpans/">arpans</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl6_LinkList__ctl3_Link href="http://blog.u2u.info/DottextWeb/patrick/">Patrick Tisseghem's Blog</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl6_LinkList__ctl4_Link href="http://www.bluedoglimited.com/SharePointThoughts/default.aspx">SharePoint Thoughts</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl6_LinkList__ctl5_Link href="http://www.skillart.com/blog/">SKILLART SharePoint Blogs</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl6_LinkList__ctl6_Link href="http://blog.spsclerics.com/">Stramit's SharePoint Blog</A> </LI></UL></DIV>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>国外.NET Blog</H3>
<UL></UL></DIV>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>喜爱的网站</H3>
<UL>
<LI><A id=Singlecolumn2_Categories_CatList__ctl8_LinkList__ctl1_Link href="http://csharp-source.net/">C# Open Source</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl8_LinkList__ctl2_Link href="http://www.codeproject.com/">codeproject</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl8_LinkList__ctl3_Link href="http://www.csdn.net/">CSDN</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl8_LinkList__ctl4_Link href="http://dotnetjunkies.com/WebLog/">dotnetjunkies.com</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl8_LinkList__ctl5_RssLink title="Subscribe to SnowCat" href="http://sn0wcat.europe.webmatrixhosting.net/SyndicationService.asmx/GetRss"><IMG title="Subscribe to SnowCat" alt="" src="http://www.cnblogs.com/Skins/KJC/Images/xmlsmall.gif" border=0></A><A id=Singlecolumn2_Categories_CatList__ctl8_LinkList__ctl5_Link href="http://sn0wcat.europe.webmatrixhosting.net/">SnowCat</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl8_LinkList__ctl6_Link href="http://weblogs.asp.net/">Weblogs @ ASP.NET</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl8_LinkList__ctl7_Link href="http://blog.joycode.com/">博客堂</A> </LI></UL></DIV>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>友情博客</H3>
<UL>
<LI><A id=Singlecolumn2_Categories_CatList__ctl9_LinkList__ctl1_Link href="http://www.blogjava.net/briansun/">briansun</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl9_LinkList__ctl2_Link href="http://www.cnblogs.com/idior">idior</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl9_LinkList__ctl3_Link href="http://www.cnblogs.com/xuebinh/">xuebin</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl9_LinkList__ctl4_Link href="http://blog.aspcool.com/tim/">飞鹰手记</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl9_LinkList__ctl5_Link href="http://www.cnblogs.com/unruledboy/">灵感之源</A> 
<LI><A id=Singlecolumn2_Categories_CatList__ctl9_LinkList__ctl6_Link href="http://www.cnblogs.com/zhenyulu/">吕震宇</A> </LI></UL></DIV>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>正在阅读</H3>
<UL>
<LI><A id=Singlecolumn2_Categories_CatList__ctl10_LinkList__ctl1_Link href="http://www.china-pub.com/computers/common/info.asp?id=14700"><IMG src="http://www.cnblogs.com/images/cnblogs_com/dudu/21972/o_EssentialDotNET.gif"></A> </LI></UL></DIV>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>搜索</H3>
<UL>
<LI>
<SCRIPT language=JavaScript>
function Search(url,key,evt)
		{
			if(evt.keyCode==13 || evt.keyCode==0)
			{
				key.focus();
				var keystr=encodeURIComponent(key.value);
				url=url+keystr;
				//event.keyCode = 9;
				window.location=url;
				return;
			}
		}
</SCRIPT>
<INPUT id=Singlecolumn2__ctl2_SearchForm1_tbSearch onkeydown="Search('http://www.cnblogs.com/dudu/BlogSearch.aspx?q=',document.getElementById('Singlecolumn2__ctl2_SearchForm1_tbSearch'),event)" style="WIDTH: 120px" name=Singlecolumn2:_ctl2:SearchForm1:tbSearch>&nbsp;<INPUT id=Singlecolumn2__ctl2_SearchForm1_btnSearch onclick="Search('http://www.cnblogs.com/dudu/BlogSearch.aspx?q=',document.getElementById('Singlecolumn2__ctl2_SearchForm1_tbSearch'),event)" type=button value=搜索 name=Singlecolumn2:_ctl2:SearchForm1:btnSearch> </LI></UL></DIV>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>最新评论 <A id=Singlecolumn2__f4b2548a79861f8a_RSSHyperlink1 href="http://www.cnblogs.com/dudu/CommentsRSS.aspx"><IMG alt="" src="http://www.cnblogs.com/images/xml.gif" border=0></A></H3>
<DIV class=RecentComment>
<UL>
<LI style="WORD-BREAK: break-all"><A id=Singlecolumn2__f4b2548a79861f8a_CommentList__ctl1_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2005/04/24/51993.html#144162">1.&nbsp;re: 10 Golden rules for publishing your blog </A>
<LI style="WORD-BREAK: break-all">颇有感触。多谢作者指点迷津！！ 
<LI style="MARGIN-RIGHT: 4px; TEXT-ALIGN: right">--学海无涯 
<LI style="WORD-BREAK: break-all"><A id=Singlecolumn2__f4b2548a79861f8a_CommentList__ctl2_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2005/04/23/3460.html#144113">2.&nbsp;re: 电脑故障处理经验一则</A> 
<LI style="WORD-BREAK: break-all">评论内容较长,点击标题查看 
<LI style="MARGIN-RIGHT: 4px; TEXT-ALIGN: right">-- xxj 
<LI style="WORD-BREAK: break-all"><A id=Singlecolumn2__f4b2548a79861f8a_CommentList__ctl3_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2005/04/23/136385.html#144100">3.&nbsp;re: [小经验]ASP.NET页面的编码问题</A> 
<LI style="WORD-BREAK: break-all">页面设置是没用，程序根本就不理睬，我还碰到过不同编码页用include包含的情况，就是乱码！ 
<LI style="MARGIN-RIGHT: 4px; TEXT-ALIGN: right">--浅蓝 
<LI style="WORD-BREAK: break-all"><A id=Singlecolumn2__f4b2548a79861f8a_CommentList__ctl4_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2005/04/23/33917.html#144046">4.&nbsp;re: 日志文件分析工具—AWStats在IIS中的配置步骤</A> 
<LI style="WORD-BREAK: break-all">只是想很简单的统计日访问的情况，不需要详细的资料，不知道怎么做。 <BR>日志太大了，一天有4G，统计下来也要2-3小时。 <BR>没什么必要。 
<LI style="MARGIN-RIGHT: 4px; TEXT-ALIGN: right">--lendy 
<LI style="WORD-BREAK: break-all"><A id=Singlecolumn2__f4b2548a79861f8a_CommentList__ctl5_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2005/04/23/72700.html#143989">5.&nbsp;re: [重要新功能]团队Blog</A> 
<LI style="WORD-BREAK: break-all">评论内容较长,点击标题查看 
<LI style="MARGIN-RIGHT: 4px; TEXT-ALIGN: right">--dudu </LI></UL></DIV></DIV>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>阅读排行榜</H3>
<DIV class=RecentComment>
<UL style="WIDTH: 100%; WORD-BREAK: break-all">
<LI><A id=Singlecolumn2__1d3715d17c7ead63_TopList__ctl1_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2004/04/08/5536.aspx">1.&nbsp;电脑故障处理小经验—IE无法打开链接的处理方法(38890)</A> 
<LI><A id=Singlecolumn2__1d3715d17c7ead63_TopList__ctl2_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2004/03/17/3460.aspx">2.&nbsp;电脑故障处理经验一则(21336)</A> 
<LI><A id=Singlecolumn2__1d3715d17c7ead63_TopList__ctl3_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2004/01/15/253.aspx">3.&nbsp;Windows 2000 常见进程功能描述[转帖](17986)</A> 
<LI><A id=Singlecolumn2__1d3715d17c7ead63_TopList__ctl4_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2004/03/14/3158.aspx">4.&nbsp;新增的MSN图片(14113)</A> 
<LI><A id=Singlecolumn2__1d3715d17c7ead63_TopList__ctl5_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2004/08/30/37613.aspx">5.&nbsp;博客园程序源代码下载(11700)</A> </LI></UL></DIV></DIV>
<DIV id=cell><IMG hspace=5 src="http://www.cnblogs.com/Skins/KJC/Images/icon-group.jpg" align=left vspace=2> 
<H3>评论排行榜</H3>
<DIV class=RecentComment>
<UL style="WIDTH: 100%; WORD-BREAK: break-all">
<LI><A id=Singlecolumn2__1dbca3f32c1b8d65_TopList__ctl1_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2004/08/30/37613.aspx">1.&nbsp;博客园程序源代码下载(152)</A> 
<LI><A id=Singlecolumn2__1dbca3f32c1b8d65_TopList__ctl2_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2004/03/17/3460.aspx">2.&nbsp;电脑故障处理经验一则(102)</A> 
<LI><A id=Singlecolumn2__1dbca3f32c1b8d65_TopList__ctl3_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2004/04/08/5536.aspx">3.&nbsp;电脑故障处理小经验—IE无法打开链接的处理方法(95)</A> 
<LI><A id=Singlecolumn2__1dbca3f32c1b8d65_TopList__ctl4_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2004/11/05/60545.aspx">4.&nbsp;[重要公告]博客园准备购买自己的服务器(72)</A> 
<LI><A id=Singlecolumn2__1dbca3f32c1b8d65_TopList__ctl5_Hyperlink1 href="http://www.cnblogs.com/dudu/archive/2005/01/24/96533.aspx">5.&nbsp;[公告]博客园准备建立SharePoint团队(71)</A> </LI></UL></DIV></DIV></DIV></TD>
<TD class=MainCell width="100%">
<DIV id=main>
<DIV class=post>
<DIV class=posthead>
<H2><A class=singleposttitle id=viewpost1_TitleUrl href="http://www.cnblogs.com/dudu/articles/27184.html">正则表达式</A> </H2>Posted on 2004-07-25 14:04 dudu 阅读(1062) <A href="http://www.cnblogs.com/dudu/articles/27184.html#Post">评论(1)</A> &nbsp;<A href="http://www.cnblogs.com/dudu/admin/EditArticles.aspx?postid=27184">编辑</A>&nbsp;<A href="http://www.cnblogs.com/dudu/AddToFavorite.aspx?id=27184">收藏</A> <LINK href="http://www.cnblogs.com/dudu/Services/Pingback.aspx" rel=pingback><!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://www.cnblogs.com/dudu/articles/27184.html"
dc:identifier="http://www.cnblogs.com/dudu/articles/27184.html"
dc:title="正则表达式"
trackback:ping="http://www.cnblogs.com/dudu/services/trackbacks/27184.aspx" />
</rdf:RDF>
--></DIV>
<DIV class=postbody>
<DIV class=post>
<DIV class=username id=u1><B>bluesean</B> </DIV>
<DIV class=posttext id=p1>正则表达式（一） <BR><BR>一、简介 <BR><BR>正则表达式这个名词，相信很多人都听说过，这个名词最早起源于1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上，发表了一篇标题为“神经网事件的表示法”的论文，引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式，因此采用“正则表达式”这个术语。 <BR><BR>随后，发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究，Ken Thompson是Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的qed 编辑器。 <BR><BR>Q: 正则表达式，能够为我们做什么呢？ <BR><BR>A: 基于文本的编辑器和搜索工具中的一个重要部分。正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式，然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较，根据比较对象中是否包含匹配模式，执行相应的程序。 <BR><BR>下面我们就一步一步的结合它的语法，来介绍正则表达式的使用。 <BR><BR>二、初次接触正则表达式 <BR><BR>我们先来了解正则表达式的一些基本概念。正则表达式作为一种表示语言，其定义了自己的一套描述方式，来描述各种各样的字符类。下面摘取msdn中的一段定义。（ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconcharacterclasses.htm） <BR><BR>字符转义表 <BR>字符类 <BR>含义 <BR><BR>. <BR>与除 \n 以外的任何字符匹配。如果通过 Singleline 选项（请参阅正则表达式选项）进行了修改，则句点字符与任何字符匹配。 <BR><BR>[aeiou] <BR>与指定字符集中包含的任何单个字符匹配。 <BR><BR>[^aeiou] <BR>与不在指定字符集中的任何单个字符匹配。 <BR><BR>[0-9a-fA-F] <BR>使用连字号 (–) 允许指定连续字符范围。 <BR><BR>\p{name} <BR>与 name 指定的命名字符类中的任何字符匹配。支持的名称为 Unicode 组和块范围。例如 Ll￡?Nd￡?Z￡?IsGreek￡?IsBoxDrawing。 <BR><BR>\P{name} <BR>与在 {name} 中指定的组和块范围中未包含的文本匹配。 <BR><BR>\w <BR>与任何单词字符匹配。等效于 Unicode 字符类别 <BR>[\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为，则 \w 等同于 [a-zA-Z_0-9]。 <BR><BR>\W <BR>与任何非单词字符匹配。等效于 Unicode 类别 [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为，则 \W 等同于 [^a-zA-Z_0-9]。 <BR><BR>\s <BR>与任何空白字符匹配。等效于 Unicode 字符类别 [\f\n\r\t\v\x85\p{Z}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为，则 \s 等同于 [ \f\n\r\t\v]。 <BR><BR>\S <BR>与任何非空白字符匹配。等效于 Unicode 字符类别 [^\f\n\r\t\v\x85\p{Z}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为，则 \S 等同于 [^ \f\n\r\t\v]。 <BR><BR>\d <BR>与任何十进制数字匹配。与 Unicode 的 \p{Nd} 和非 Unicode 的 [0-9] 以及 ECMAScript 行为一样。 <BR><BR>\D <BR>与任何非数字匹配。与 Unicode 的 \P{Nd} 和非 Unicode 的 [^0-9] 以及 ECMAScript 行为一样。 <BR><BR><BR>上表列举了，正则表达式中最最基本的语法定义，了解这些，我们已经可以定义一些简单的规则了，例如： <BR><BR>1． 匹配所有的字符 <BR><BR>当然是什么都不用写(@_@) <BR><BR>2． 匹配所有的英文字符 <BR><BR>a) \w <BR><BR>b) [a-zA-Z_0-9] <BR><BR>3． 匹配十进制数字 <BR><BR>a) \d <BR><BR>b) [0-9] <BR><BR>看上面的例子，是不是觉得很简单呢，不过，到目前为止，这样写出来的规则，还有一个很大的缺陷，就是没有声明匹配字符的个数？ <BR><BR>Q: 我希望要匹配的字符为5个英文字母 <BR><BR>A: ？？？ <BR><BR>光了解上面的知识是，无法解决这个的L。那正则表达式中是如何解决这个问题的呢，我们来看下面这个表： <BR><BR>（ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconquantifiers.htm） <BR><BR>限定符表 <BR>限定符 <BR>说明 <BR><BR>* <BR>指定零个或更多个匹配；例如 \w* 或 (abc)*。与 {0,} 相同。 <BR><BR>+ <BR>指定一个或多个匹配；例如 \w+ 或 (abc)+。与 {1,} 相同。 <BR><BR>? <BR>指定零个或一个匹配；例如 \w? 或 (abc)?。与 {0,1} 相同。 <BR><BR>{n} <BR>指定恰好 n 个匹配；例如 (pizza){2}。 <BR><BR>{n,} <BR>指定至少 n 个匹配；例如 (abc){2,}。 <BR><BR>{n,m} <BR>指定至少 n 个但不多于 m 个匹配。 <BR><BR>*? <BR>指定尽可能少地使用重复的第一个匹配 (lazy *)。 <BR><BR>+? <BR>指定尽可能少地使用重复但至少使用一次 (lazy +)。 <BR><BR>?? <BR>指定使用零次重复（如有可能）或一次重复 (lazy ?)。 <BR><BR>{n}? <BR>等效于 {n} (lazy {n})。 <BR><BR>{n,}? <BR>指定尽可能少地使用重复，但至少使用 n 次 (lazy {n,})。 <BR><BR>{n,m}? <BR>指定介于 n 次和 m 次之间、尽可能少地使用重复 (lazy {n,m})。 <BR><BR><BR>上表中列出了，正则表达式的限定方式，配合这些字符的使用，我们就可以很方便的编写更为强劲的正则表达式了。 <BR><BR>例如： <BR><BR>1． 匹配零个或多个所有的字符 <BR><BR>* <BR><BR>2． 匹配一个或多个所有字符 <BR><BR>+ <BR><BR>3． 匹配零个或多个所有的英文字符 <BR><BR>\w* <BR><BR>4． 匹配一个或多个所有的英文字符 <BR><BR>[a-zA-Z0-9]+ <BR><BR>5． 匹配3个十进制数字 <BR><BR>\d{3} <BR><BR>6． 匹配最少3个十进制数字 <BR><BR>\d{3,} <BR><BR>7． 匹配3个到6个十进制数字 <BR><BR>\d{3,6} <BR><BR>现在我们可以解答上面问题了： <BR><BR>Q: 我希望要匹配的字符为5个英文字母 <BR><BR>A: \w{5} <BR><BR>很高兴，我们已解决了上面的问题，不过，新的问题总是在不断的出现。我如何限制匹配字符出现在哪里呢？ <BR><BR>Q: 我希望匹配以doc开头的字符串 <BR><BR>A: ??? <BR><BR>为了解决这个问题，我们先来看看这个表： <BR><BR>(ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconatomiczero-widthassertions.htm) <BR><BR>原子零宽度断言 <BR>断言 <BR>说明 <BR><BR>^ <BR>指定匹配必须出现在字符串的开头或行的开头。有关更多信息，请参阅正则表达式选项中的 Multiline 选项。 <BR><BR>$ <BR>指定匹配必须出现在以下位置：字符串结尾、字符串结尾的 \n 之前或行的结尾。有关更多信息，请参阅正则表达式选项中的 Multiline 选项。 <BR><BR>\A <BR>指定匹配必须出现在字符串的开头（忽略 Multiline 选项）。 <BR><BR>\Z <BR>指定匹配必须出现在字符串的结尾或字符串结尾的 \n 之前（忽略 Multiline 选项）。 <BR><BR>\z <BR>指定匹配必须出现在字符串的结尾（忽略 Multiline 选项）。 <BR><BR>\G <BR>指定匹配必须出现在当前搜索开始的位置（此位置通常是上一次搜索结束位置之后的第一个字符）。例如，请考虑一个由分离的字符组组成的串联字符串，其中每一组的长度都为 n 个字符。在每个字符组中搜索匹配时，如果正则表达式在 0、n、2n、3n 等字符位置找到匹配，则该正则表达式成功。仅当匹配出现在定位组边界上时才会成功。 <BR><BR>\b <BR>指定匹配必须出现在 \w（字母数字）和 \W（非字母数字）字符之间的边界上。匹配必须出现在单词边界上，即出现在由空格分隔的单词中第一个或最后一个字符上。 <BR><BR>\B <BR>指定匹配不得出现在 \b 边界上。 <BR><BR><BR>相信大家都注意到了，在这个表中第一个断言字符就是我们需要的@_@. <BR><BR>例如，^ 指定当前位置在行或字符串的开头。因此，正则表达式 ^FTP 只会返回那些在行的开头出现的字符串“FTP”的匹配项。 <BR><BR>看来上面碰到的问题，又可以解决了，让我们一起来解决上面的问题： <BR><BR>Q: 我希望匹配以doc开头的字符串 <BR><BR>A: ^doc <BR><BR>以上我们初步了解了什么是正则表达式，已经了解其最基本的语法，当作热身@_@，接下来，才正式进入主题，我们会从第二篇开始深入探讨正则表达式的使用。 <BR>在前一篇文章中，介绍了一些初步的正则表达式的基本概念，相信很多人对正则表达式的基本知识有所了解，接下来，我们结合一些实际的编程示例来掩饰说明正则表达式的作用。 <BR><BR>首先，我们先看几个实际的例子： <BR><BR>1． 验证输入字符是否全部为英文字符 <BR><BR>javascript: <BR><BR>var ex = "^\\w+$"; <BR><BR>var re = new RegExp(ex,"i"); <BR><BR>return re.test(str); <BR><BR>VBScript <BR><BR>Dim regEx,flag,ex <BR><BR>ex = "^\w+$" <BR><BR>Set regEx = New RegExp <BR><BR>regEx.IgnoreCase = True <BR><BR>regEx.Global = True <BR><BR>regEx.Pattern = ex <BR><BR>flag = regEx.Test( str ) <BR><BR>C# <BR><BR>System.String ex = @"^\w+$"; <BR><BR>System.Text.RegularExpressions.Regex reg = new Regex( ex ); bool flag = reg.IsMatch( str ); <BR><BR>2． 验证邮件格式 <BR><BR>C# <BR><BR>System.String ex = @"^\w+@\w+\.\w+$"; <BR><BR>System.Text.RegularExpressions.Regex reg = new Regex( ex ); <BR><BR>bool flag = reg.IsMatch( str ); <BR><BR>3． 更改日期的格式（用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式） <BR><BR>C# <BR><BR>String MDYToDMY(String input) <BR><BR>{ <BR><BR>return Regex.Replace(input, <BR><BR>"\\b(?&lt;month&gt;\\d{1,2})/(?&lt;day&gt;\\d{1,2})/(?&lt;year&gt;\\d{2,4})\\b", <BR><BR>"${day}-${month}-${year}"); <BR><BR>} <BR><BR>4． 从 URL 提取协议和端口号 <BR><BR>C# <BR><BR>String Extension(String url) <BR><BR>{ <BR><BR>Regex r = new Regex(@"^(?&lt;proto&gt;\w+)://[^/]+?(?&lt;port&gt;:\d+)?/", <BR><BR>RegexOptions.Compiled); <BR><BR>return r.Match(url).Result("${proto}${port}"); <BR><BR>} <BR><BR>这里的例子可能是我们在网页开发中，通常会碰到的一些正则表达式，尤其在第一个例子中，给出了使用javascript,vbScript,C#等不同语言的实现方式，大家不难看出，对于不同的语言来说，正则表达式没有区别，只是正则表达式的实现类不同而已。而如何发挥正则表达式的公用，也要看实现类的支持。 <BR><BR>（摘自msdn: Microsoft .NET 框架 SDK 提供大量的正则表达式工具，使您能够高效地创建、比较和修改字符串，以及迅速地分析大量文本和数据以搜索、移除和替换文本模式。ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconregularexpressionslanguageelements.htm） <BR><BR>下面我们逐个来分析这些例子： <BR><BR>1-2，这两个例子很简单，只是简单的验证字符串是否符合正则表达式规定的格式，其中使用的语法，在第一篇文章中都已经介绍过了，这里做一下简单的描述。 <BR><BR>第1个例子的表达式： ^\w+$ <BR><BR>^ -- 表示限定匹配开始于字符串的开始 <BR><BR>\w – 表示匹配英文字符 <BR><BR>+ -- 表示匹配字符出现1次或多次 <BR><BR>$ -- 表示匹配字符到字符串结尾处结束 <BR><BR>验证形如asgasdfs的字符串 <BR><BR>第2个例子的表达式： ^\w+@\w+.\w+$ <BR><BR>^ -- 表示限定匹配开始于字符串的开始 <BR><BR>\w – 表示匹配英文字符 <BR><BR>+ -- 表示匹配字符出现1次或多次 <BR><BR>@ -- 匹配普通字符@ <BR><BR>\. – 匹配普通字符.(注意.为特殊字符,因此要加上\转译) <BR><BR>$ -- 表示匹配字符到字符串结尾处结束 <BR><BR>验证形如dragontt@sina.com的邮件格式 <BR><BR><BR><BR><BR><BR>第3 个例子中，使用了替换，因此，我们还是先来看看正则表达式中替换的定义： <BR><BR>（ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconsubstitutions.htm） <BR><BR>替换 <BR>字符 <BR>含义 <BR><BR>$123 <BR>替换由组号 123（十进制）匹配的最后一个子字符串。 <BR><BR>${name} <BR>替换由 (?&lt;name&gt; ) 组匹配的最后一个子字符串。 <BR><BR>$$ <BR>替换单个“$”字符。 <BR><BR>$&amp; <BR>替换完全匹配本身的一个副本。 <BR><BR>$` <BR>替换匹配前的输入字符串的所有文本。 <BR><BR>$' <BR>替换匹配后的输入字符串的所有文本。 <BR><BR>$+ <BR>替换最后捕获的组。 <BR><BR>$_ <BR>替换整个输入字符串。 <BR><BR><BR>分组构造 <BR>（ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpcongroupingconstructs.htm） <BR><BR>分组构造 <BR>定义 <BR><BR>( ) <BR>捕获匹配的子字符串（或非捕获组；有关更多信息，请参阅正则表达式选项中的 ExplicitCapture 选项。）使用 () 的捕获根据左括号的顺序从 1 开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本。 <BR><BR>(?&lt;name&gt; ) <BR>将匹配的子字符串捕获到一个组名称或编号名称中。用于 name 的字符串不能包含任何标点符号，并且不能以数字开头。可以使用单引号替代尖括号，例如 (?'name')。 <BR><BR>(?&lt;name1-name2&gt; ) <BR>平衡组定义。删除先前定义的 name2 组的定义并在 name1 组中存储先前定义的 name2 组和当前组之间的间隔。如果未定义 name2 组，则匹配将回溯。由于删除 name2 的最后一个定义会显示 name2 的先前定义，因此该构造允许将 name2 组的捕获堆栈用作计数器以跟踪嵌套构造（如括号）。在此构造中，name1 是可选的。可以使用单引号替代尖括号，例如 (?'name1-name2')。 <BR><BR>(?: ) <BR>非捕获组。 <BR><BR>(?imnsx-imnsx: ) <BR>应用或禁用子表达式中指定的选项。例如，(?i-s: ) 将打开不区分大小写并禁用单行模式。有关更多信息，请参阅正则表达式选项。 <BR><BR>(?= ) <BR>零宽度正预测先行断言。仅当子表达式在此位置的右侧匹配时才继续匹配。例如，\w+(?=\d) 与后跟数字的单词匹配，而不与该数字匹配。此构造不会回溯。 <BR><BR>(?! ) <BR>零宽度负预测先行断言。仅当子表达式不在此位置的右侧匹配时才继续匹配。例如，\b(?!un)\w+\b 与不以 un 开头的单词匹配。 <BR><BR>(?&lt;= ) <BR>零宽度正回顾后发断言。仅当子表达式在此位置的左侧匹配时才继续匹配。例如，(?&lt;=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。 <BR><BR>(?&lt;! ) <BR>零宽度负回顾后发断言。仅当子表达式不在此位置的左侧匹配时才继续匹配。 <BR><BR>(?&gt; ) <BR>非回溯子表达式（也称为贪婪子表达式）。该子表达式仅完全匹配一次，然后就不会逐段参与回溯了。（也就是说，该子表达式仅与可由该子表达式单独匹配的字符串匹配。） <BR><BR><BR><BR><BR>我们还是先简单的了解一下这两个概念： <BR><BR>分组构造： <BR><BR>最基本的构造方式就是(),在左右括号中括起来的部分，就是一个分组； <BR><BR>更进一步的分组就是形如：(?&lt;name&gt; )的分组方式，这种方式与第一种方式的不同点，就是对分组的部分进行了命名，这样就可以通过该组的命名来获取信息； <BR><BR>（还有形如(?= )等等的分组构造，我们这篇的例子中也没有使用到，下次我们在来介绍） <BR><BR>替换： <BR><BR>上面提到了两种基本的构造分组方式()以及(?&lt;name&gt; )，通过这两种分组方式，我们可以得到形如$1,${name}的匹配结果。 <BR><BR><BR><BR>这样说，可能概念上还是有些模糊，我们还是结合上面的例子来说： <BR><BR>第三个例子的正则表达式为：\\b(?&lt;month&gt;\\d{1,2})/(?&lt;day&gt;\\d{1,2})/(?&lt;year&gt;\\d{2,4})\\b <BR><BR>（解释一下，为什么这里都是\\一起用：这里是C#的例子，在C#语言中\是转译字符，要想字符串中的\不转译，就需要使用\\或者在整个字符串的开始加上@标记，即上面等价与 <BR><BR>@”\b(?&lt;month&gt;\d{1,2})/(?&lt;day&gt;\d{1,2})/(?&lt;year&gt;\d{2,4}\b”） <BR><BR>\b -- 是一种特殊情况。在正则表达式中，除了在 [] 字符类中表示退格符以外，\b 表示字边界（在 \w 和 \W 字符之间）。在替换模式中，\b 始终表示退格符 <BR><BR>(?&lt;month&gt;\d{1,2}) – 构造一个名为month的分组，这个分组匹配一个长度为1-2的数字 <BR><BR>/ -- 匹配普通的/字符 <BR><BR>(?&lt;day&gt;\d{1,2}) --构造一个名为day的分组，这个分组匹配一个长度为1-2的数字 <BR><BR>/ -- 匹配普通的/字符 <BR><BR>(?&lt;year&gt;\d{2,4}\b”） --构造一个名为year的分组，这个分组匹配一个长度为2-4的数字 <BR><BR><BR><BR>这里还不能够看出这些分组的作用，我们接着看这一句 <BR><BR>${day}-${month}-${year} <BR><BR>${day} – 获得上面构造的名为day的分组匹配后的信息 <BR><BR>- -- 普通的-字符 <BR><BR>${month} --获得上面构造的名为month的分组匹配后的信息 <BR><BR>- -- 普通的-字符 <BR><BR>${year} --获得上面构造的名为year的分组匹配后的信息 <BR><BR><BR><BR>举例来说： <BR><BR>将形如04/02/2003的日期使用例3种的方法替换 <BR><BR>(?&lt;month&gt;\d{1,2}) 分组将匹配到04由${month}得到这个匹配值 <BR><BR>(?&lt;day&gt;\d{1,2}) 分组将匹配到02由${day}得到这个匹配值 <BR><BR>(?&lt;year&gt;\d{1,2}) 分组将匹配到2003由${year}得到这个匹配值 <BR><BR>了解了这个例子后，我们在来看第4个例子就很简单了。 <BR><BR><BR><BR>第4个例子的正则 <BR><BR>^(?&lt;proto&gt;\w+)://[^/]+?(?&lt;port&gt;:\d+)?/ <BR><BR>^ -- 表示限定匹配开始于字符串的开始 <BR><BR>(?&lt;proto&gt;\w+) – 构造一个名为proto的分组，匹配一个或多个字母 <BR><BR>: -- 普通的:字符 <BR><BR>// -- 匹配两个/字符 <BR><BR>[^/] – 表示这里不允许是/字符 <BR><BR>+? – 表示指定尽可能少地使用重复但至少使用一次匹配 <BR><BR>(?&lt;port&gt;:\d+) – 构造一个名为port的分组，匹配形如:2134（冒号+一个或多个数字） <BR><BR>? – 表示匹配字符出现0次或1次 <BR><BR>/ -- 匹配/字符 <BR><BR><BR><BR>最后通过${proto}${port}来获取两个分组构造的匹配内容 <BR><BR>（有关Regex对象的用法，参考 <BR><BR>ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemTextRegularExpressionsRegexMembersTopic.htm） <BR><BR><BR><BR>好了，本次介绍的几个例子，也讲得差不多了，希望大家有所收获，下次，在就一些特殊的要求，进一步探讨正则表达式的实现。 <BR>前面的文章中，介绍了正则表达式的基本语法，以及一些简单的例子。但这些并不是我们会遇到的全部问题，有些时候我们不得不编写一些较为复杂的正则表达式来解决我们的实际问题。 <BR><BR>这里，我先提几个问题，然后，我们逐个运用正则表达式的知识来解决。 <BR><BR>1． 符合两种条件之一，都成立，例如：是纯数字或者纯字符 <BR><BR>123（true）,hello(true),234.test23(false) <BR><BR>2． 要得到不以数字开头的字符组合 <BR><BR>如：How2234do&gt;you234do,希望得到How和you而不是do,do <BR><BR>3． 得到以数字开头的字符组合 <BR><BR>上例中，得到do和do <BR><BR>4． 要得到不以数字结尾的字符组合 <BR><BR>还是上面的情况，要得到的是Ho,do,yo,do <BR><BR>5． 得到以数字结尾的字符组合 <BR><BR>同上例，得到Ho,do,yo,do <BR><BR>6． 不允许字符中ab同时出现 <BR><BR>例：nihaoma(true),above(false),agoodboy(true) <BR><BR><BR><BR>下面我们开始着手解决这些问题： <BR><BR>第一个：符合两种条件之一，都成立 <BR><BR>这种要求可能代表着一种普遍的要求，我们先来看看这个表 <BR><BR>替换构造 <BR>替换构造 <BR>定义 <BR><BR>| <BR>与由|（垂直条）字符分隔的术语中的任何一个术语匹配；例如 cat|dog|tiger。使用最左侧的成功匹配。 <BR><BR>(?(expression)yes|no) <BR>如果表达式在此位置匹配，则与“yes”部分匹配；否则，与“no”部分匹配。“no”部分可省略。表达式可以是任何有效的表达式，但它将变为零宽度断言，因此该语法等效于 (?(?=expression)yes|no)。请注意，如果表达式是命名组的名称或捕获组编号，则替换构造将解释为捕获测试（在本表的下一行对此进行了描述）。若要避免在这些情况下产生混淆，则可以显式拼出内部 (?=expression)。 <BR><BR>(?(name)yes|no) <BR>如果命名捕获字符串有匹配，则与“yes”部分匹配；否则，与“no”部分匹配。“no”部分可省略。如果给定的名称不与此表达式中使用的捕获组的名称或编号对应，则替换构造将解释为表达式测试（在本表的上一行进行了描述）。 <BR><BR><BR>（ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconalternationconstructs.htm） <BR><BR>在这个表中，我们看到，正则中为了解决这一类问题，定义了|来表示或者的关系，就好像常见的或运算符一样，现在我们来看看如何利用|来解决我们的问题。 <BR><BR>1． 先为可选择的表达式撰写表达式： <BR><BR>a) 纯数字 – [0-9]* <BR><BR>b) 纯字母 – [a-zA-Z]* <BR><BR>2． 将可选条件用|连接起来就是我们所需的 <BR><BR>^[0-9]*$|^[a-zA-Z]*$ <BR><BR>(这里我特别对两个条件加上了^和$限定符，这在验证字符串是否完全符合要求时，是十分必要的，如果不加这两个限定符，有兴趣的朋友可以自己试一下效果。 <BR><BR><BR><BR>后面四个问题，其实是一类的，所以我们把它们放在一起处理。接下来我们来解决第二到第四个问题： <BR><BR>首先，我们回顾一下上次介绍的分组构造： <BR><BR>(?= ) <BR>零宽度正预测先行断言。仅当子表达式在此位置的右侧匹配时才继续匹配。例如，\w+(?=\d) 与后跟数字的单词匹配，而不与该数字匹配。此构造不会回溯。 <BR><BR>(?! ) <BR>零宽度负预测先行断言。仅当子表达式不在此位置的右侧匹配时才继续匹配。例如，\b(?!un)\w+\b 与不以 un 开头的单词匹配。 <BR><BR>(?&lt;= ) <BR>零宽度正回顾后发断言。仅当子表达式在此位置的左侧匹配时才继续匹配。例如，(?&lt;=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。 <BR><BR>(?&lt;! ) <BR>零宽度负回顾后发断言。仅当子表达式不在此位置的左侧匹配时才继续匹配。 <BR><BR><BR>可以看到，这个表的这四种规则，正好可以解决我们的问题。 <BR><BR>@_@先解决我们的问题再说： <BR><BR>第二例：要得到不以数字开头的字符组合 <BR><BR>(?&lt;!\d)[a-zA-Z]{2,} <BR><BR>(?&lt;!\d) -- 限定字符的开头不为数字才匹配 <BR><BR>[a-zA-Z]{2,} – 描述匹配2个以上的字母 <BR><BR>(注：这是取巧的做法，因为，按照我们的逻辑How2234do&gt;you234do中的两个do的o字母也是符合的，不过，这不是我们想要的，当然还有其他的解决办法，可以根据实际的情况来处理，这里是为了讲解这个方法@_@) <BR><BR>第三例：得到以数字开头的字符组合 <BR><BR>(?&lt;=\d)[a-zA-Z]+ <BR><BR>(?&lt;=\d) – 限定为数字开头的字符才匹配 <BR><BR>[a-zA-Z]+ -- 描述匹配1个或多个字母 <BR><BR>第四例：要得到不以数字结尾的字符组合 <BR><BR>[a-zA-Z]+(?!\d) <BR><BR>[a-zA-Z]+ -- 描述匹配1个或多个字母 <BR><BR>(?!\d) – 限定不为数字结尾的字母才匹配 <BR><BR>第五例：得到以数字结尾的字符组合 <BR><BR>[a-zA-Z]+(?=\d) <BR><BR>[a-zA-Z]+ -- 描述匹配1个或多个字母 <BR><BR>(?=\d) – 限定为数字结尾的字母才匹配 <BR><BR><BR><BR>第六例：不允许字符中ab同时出现 <BR><BR>^(?!.*?ab).*$ <BR><BR>(?!.*?ab) – 限定不允许出现ab相连的字符 <BR><BR>.* -- 任意字符 <BR><BR><BR><BR>介绍到这里，我们这一次提出的问题，也都解决了，例子虽然简单，不过，再复杂的东西也是建立在简单的基础上的。其实写正则表达式的关键就是要善于定制规则，用最简练正确的话来描述，然后用正则表达式的语法写出来，就可以了(@_@)这就要靠大家多积累经验了。 <BR><BR>zt from CSDN </DIV></DIV></DIV></DIV>
<H3>Feedback</H3>
<DIV class=post>
<DIV class=posthead>
<H2><A title="permalink: re: 正则表达式" href="http://www.cnblogs.com/dudu/articles/27184.html#41605">#</A>&nbsp;<A name=41605></A>re: 正则表达式<A name=Post></A> <A id=Comments1_CommentList__ctl0_DeleteLink href="javascript:__doPostBack('Comments1$CommentList$_ctl0$DeleteLink','')"></A>&nbsp;&nbsp;<A id=Comments1_CommentList__ctl0_EditLink></A> </H2>2004-09-10 00:14 by <A id=Comments1_CommentList__ctl0_NameLink href="http://blog.csdn.net/laily" target=_blank>a</A> </DIV>
<DIV class=postbody>good!</DIV></DIV>
<STYLE>
TD { FONT-SIZE: 12px }
.commentTextBox { FONT-SIZE: 12px }
</STYLE>
<!--Beging Temp Save-->
<STYLE>.userData { BEHAVIOR: url(#default#userdata) }
	</STYLE>

<DIV class=userData id=CommentsPersistDiv></DIV>
<SCRIPT>
			function TempSave(ElementID)
			{
				CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value);
				CommentsPersistDiv.save("CommentXMLStore");
			}
			function Restore(ElementID)
			{
				CommentsPersistDiv.load("CommentXMLStore");
				document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent");
			}
		
</SCRIPT>
<!--Ene TempSave-->
<DIV class=commentform>
<TABLE cellSpacing=1 cellPadding=1 border=0>
<TBODY>
<TR>
<TD width=75></TD></TR>
<TR>
<TD width=55>标题</TD>
<TD><INPUT id=AnonymousPostComment1_tbTitle style="WIDTH: 300px" size=40 value="re: 正则表达式" name=AnonymousPostComment1:tbTitle></TD>
<TD><SPAN id=AnonymousPostComment1_RequiredFieldValidator1 style="VISIBILITY: hidden; COLOR: red" isvalid="true" controltovalidate="AnonymousPostComment1_tbTitle" errormessage="请输入标题" initialvalue="">请输入标题</SPAN></TD></TR>
<TR>
<TD>姓名</TD>
<TD><INPUT id=AnonymousPostComment1_tbName style="WIDTH: 300px" size=40 name=AnonymousPostComment1:tbName></TD>
<TD><SPAN id=AnonymousPostComment1_RequiredFieldValidator2 style="VISIBILITY: hidden; COLOR: red" isvalid="true" controltovalidate="AnonymousPostComment1_tbName" errormessage="请输入你的姓名" initialvalue="">请输入你的姓名</SPAN></TD></TR>
<TR>
<TD>主页</TD>
<TD><INPUT id=AnonymousPostComment1_tbUrl style="WIDTH: 300px" size=40 name=AnonymousPostComment1:tbUrl></TD>
<TD><FONT face=宋体></FONT></TD></TR>
<TR>
<TD align=left colSpan=3>
<TABLE class=CommentForm id=AnonymousPostComment1_tbCaptchaImage cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD colSpan=3><SPAN id=AnonymousPostComment1_Requiredfieldvalidator4 style="DISPLAY: none; COLOR: red" isvalid="true" controltovalidate="AnonymousPostComment1_CodeNumberTextBox" errormessage="请输入验证码" initialvalue="" display="Dynamic">请输入验证码</SPAN> <SPAN id=AnonymousPostComment1_lblImage style="FONT-WEIGHT: bold; COLOR: red"></SPAN></TD></TR>
<TR>
<TD width=58>验证码</TD>
<TD><INPUT id=AnonymousPostComment1_CodeNumberTextBox name=AnonymousPostComment1:CodeNumberTextBox>*</TD>
<TD align=left><IMG id=AnonymousPostComment1_Img1 src="http://www.cnblogs.com/Modules/CaptchaImage/JpegImage.aspx"> </TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=3>内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容) <SPAN id=AnonymousPostComment1_RequiredFieldValidator3 style="VISIBILITY: hidden; COLOR: red" isvalid="true" controltovalidate="AnonymousPostComment1_tbComment" errormessage="请输入评论内容" initialvalue="">请输入评论内容</SPAN><BR><TEXTAREA class=commentTextBox id=AnonymousPostComment1_tbComment onkeydown=ctlent() style="WIDTH: 400px; HEIGHT: 193px" name=AnonymousPostComment1:tbComment rows=10 cols=50></TEXTAREA></TD></TR>
<TR>
<TD colSpan=3><INPUT id=AnonymousPostComment1_chkRemember tabIndex=-1 type=checkbox name=AnonymousPostComment1:chkRemember><LABEL for=AnonymousPostComment1_chkRemember>Remember Me?</LABEL></TD></TR>
<TR>
<TD height=23><INPUT language=javascript class=commentTextBox id=AnonymousPostComment1_btnSubmit onclick="TempSave('AnonymousPostComment1_tbComment');if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " type=submit value=提交 name=AnonymousPostComment1:btnSubmit> </TD>
<TD colSpan=2 height=23>&nbsp]]></description>
</item><item>
<title><![CDATA[常用]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=5244</link>
<author>summer_smile</author>
<pubDate>2005/4/24 0:35:44</pubDate>
<description><![CDATA[一、验证类<BR>1、数字验证内<BR>1.1 整数<BR>/^(-│+)?d+$/　　不可以为空<BR>/^[-+]?d*$/ 可以为空<BR>1.2 大于0的整数 （用于传来的ID的验证)<BR>/^d+$/<BR>1.3 负整数的验证<BR>/^-d+$/<BR>1.4 整数不能大于iMax<BR>根据上面的正则可以写出。<BR>1.5 整数不能小于iMin<BR>根据上面的正则可以写出。<BR>2、时间类<BR>2.1 短时间，形如 (13:04:06)<BR>　　　　function isTime(str)<BR>{<BR>var a = str.match(/^(d)(<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=:) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/smile.png">?(d)2(d)$/);<BR>if (a == null) {alert('输入的参数不是时间格式'); return false;}<BR>if (a[1]&gt;24 ││ a[3]&gt;60 ││ a[4]&gt;60)<BR>{<BR>alert("时间格式不对"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">;<BR>return false<BR>}<BR>return true;<BR>}<BR><BR>2.2 短日期，形如 (2003-12-05)<BR>function strDateTime(str)<BR>{<BR>var r = str.match(/^(d)(-│/)(d)2(d)$/); <BR>if(r==null)return false; <BR>var d= new Date(r[1], r[3]-1, r[4]); <BR>return (d.getFullYear()==r[1]&amp;&amp;(d.getMonth()+1)==r[3]&amp;&amp;d.getDate()==r[4]);<BR>}<BR><BR>2.3 长时间，形如 (2003-12-05 13:04:06)<BR>function strDateTime(str)<BR>{<BR>var reg = /^(d)(-│/)(d)2(d) (d)<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=:( src="http://www.romanfr.com/weblog/templates/default/img/emoticons/sad.png">d)<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=:( src="http://www.romanfr.com/weblog/templates/default/img/emoticons/sad.png">d)$/; <BR>var r = str.match(reg); <BR>if(r==null)return false; <BR>var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]); <BR>return (d.getFullYear()==r[1]&amp;&amp;(d.getMonth()+1)==r[3]&amp;&amp;d.getDate()==r[4]&amp;&amp;d.getHours()==r[5]&amp;&amp;d.getMinutes()==r[6]&amp;&amp;d.getSeconds()==r[7]);<BR>}<BR><BR>2.4 只有年和月。形如(2003-05,或者2003-5)<BR><BR>2.5 只有小时和分钟,形如(12:03)<BR>3、表单类<BR>3.1 所有的表单的值都不能为空<BR>&lt;input onblur="if(this.value.replace(/^s+│s+$/g,'')=='')alert('不能为空!')"&gt;<BR><BR>3.2 多行文本框的值不能为空。<BR>3.3 多行文本框的值不能超过sMaxStrleng<BR>//检验文本框中内容是否超长<BR>function CheckTextareaLength(val, max_length) {<BR>var str_area=document.forms[0].elements[val].value;<BR>if (str_area!=null&amp;&amp;str_area.length &gt; max_length)<BR>{<BR>alert("字段文字超长，最多可输入" + max_length +"个字符，请重新输入！"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">;<BR>document.forms[0].elements[val].focus();<BR>document.forms[0].elements[val].select();<BR>return false;<BR>}<BR>return true;<BR>}<BR>3.4 多行文本框的值不能少于sMixStrleng<BR>3.5 判断单选框是否选择。<BR><BR>function CheckRadio(val,msg1,msg2)<BR>{<BR>var is_radio=document.forms[0].elements[val];<BR>var s_msg1=(msg1==null ││ msg1==""<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">? "请选择 radio!":msg1;<BR>var s_msg2=(msg2==null ││ msg2==""<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">? "没有可选的 radio!":msg2;<BR><BR>if(is_radio)<BR>{<BR>if (document.forms[0].elements[val].value != null)<BR>{<BR>if (document.forms[0].elements[val].checked)<BR>{<BR>return true;<BR>}<BR>else<BR>{<BR>alert(s_msg1);<BR>return false;<BR>}<BR>}<BR>else<BR>{<BR>var check_length = document.forms[0].elements[val].length;<BR>var i_count=0<BR>for(var i=0;i&lt;check_length;i++)<BR>{<BR>if (document.forms[0].elements[val](i).checked)<BR>{<BR>i_count=i_count+1;<BR>return true;<BR>}<BR>}<BR>if(i_count==0)<BR>{<BR>alert(s_msg1);<BR>return false;<BR>}<BR>}<BR>}//<BR>else<BR>{<BR>alert(s_msg2);<BR>return false;<BR>}<BR><BR>}<BR>3.6 判断复选框是否选择.<BR>function CheckCheckbox(val,msg1,msg2)<BR>{<BR>var is_radio=document.forms[0].elements[val];<BR>var s_msg1=(msg1==null ││ msg1==""<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">? "请选择CheckBox!":msg1;<BR>var s_msg2=(msg2==null ││ msg2==""<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">? "没有可选的CheckBox!":msg2;<BR><BR>if(is_radio)<BR>{<BR>if (document.forms[0].elements[val].value != null)<BR>{<BR>if (document.forms[0].elements[val].checked)<BR>{<BR>return true;<BR>}<BR>else<BR>{<BR>alert(s_msg1);<BR>return false;<BR>}<BR>}<BR>else<BR>{<BR>var check_length = document.forms[0].elements[val].length;<BR>var i_count=0<BR>for(var i=0;i&lt;check_length;i++)<BR>{<BR>if (document.forms[0].elements[val](i).checked)<BR>{<BR>i_count=i_count+1;<BR>return true;<BR>}<BR>}<BR>if(i_count==0)<BR>{<BR>alert(s_msg1);<BR>return false;<BR>}<BR>}<BR>}//<BR>else<BR>{<BR>alert(s_msg2);<BR>return false;<BR>}<BR><BR>}<BR>3.7 复选框的全选，多选，全不选，反选<BR>&lt;form name=hrong&gt;<BR>&lt;input type=checkbox name=All onclick="checkAll('mm')"&gt;全选&lt;br/&gt;<BR>&lt;input type=checkbox name=mm onclick="checkItem('All')"&gt;&lt;br/&gt;<BR>&lt;input type=checkbox name=mm onclick="checkItem('All')"&gt;&lt;br/&gt;<BR>&lt;input type=checkbox name=mm onclick="checkItem('All')"&gt;&lt;br/&gt;<BR>&lt;input type=checkbox name=mm onclick="checkItem('All')"&gt;&lt;br/&gt;<BR>&lt;input type=checkbox name=mm onclick="checkItem('All')"&gt;&lt;br/&gt;&lt;br/&gt;<BR><BR><BR>&lt;input type=checkbox name=All2 onclick="checkAll('mm2')"&gt;全选&lt;br/&gt;<BR>&lt;input type=checkbox name=mm2 onclick="checkItem('All2')"&gt;&lt;br/&gt;<BR>&lt;input type=checkbox name=mm2 onclick="checkItem('All2')"&gt;&lt;br/&gt;<BR>&lt;input type=checkbox name=mm2 onclick="checkItem('All2')"&gt;&lt;br/&gt;<BR>&lt;input type=checkbox name=mm2 onclick="checkItem('All2')"&gt;&lt;br/&gt;<BR>&lt;input type=checkbox name=mm2 onclick="checkItem('All2')"&gt;&lt;br/&gt;<BR><BR>&lt;/form&gt;<BR><BR>&lt;SCRIPT LANGUAGE="JavaScript"&gt;<BR>function checkAll(str)<BR>{<BR>var a = document.getElementsByName(str);<BR>var n = a.length;<BR>for (var i=0; i&lt;n; i++)<BR>a.checked = window.event.srcElement.checked;<BR>}<BR>function checkItem(str)<BR>{<BR>var e = window.event.srcElement;<BR>var all = eval("document.hrong."+ str);<BR>if (e.checked)<BR>{<BR>var a = document.getElementsByName(e.name);<BR>all.checked = true;<BR>for (var i=0; i&lt;a.length; i++)<BR>{<BR>if (!a.checked){ all.checked = false; break;}<BR>}<BR>}<BR>else all.checked = false;<BR>}<BR>&lt;/SCRIPT&gt;<BR><BR><BR>3.8 文件上传过程中判断文件类型<BR>&lt;input type=file onchange="alert(this.value.match(/^(.*)(.)(.)$/)[3])"&gt;<BR><BR>4、字符类<BR>4.1 判断字符全部由a-Z或者是A-Z的字字母组成<BR>&lt;input onblur="if(/[^a-zA-Z]/g.test(this.value))alert('有错')"&gt;<BR>4.2 判断字符由字母和数字组成。<BR>&lt;input onblur="if(/[^0-9a-zA-Z]/g.test(this.value))alert('有错')"&gt;<BR><BR>4.3 判断字符由字母和数字，下划线,点号组成.且开头的只能是下划线和字母<BR>/^([a-zA-z_])([w]*)$/g.test(str)<BR><BR>4.4 字符串替换函数.Replace();<BR>5、浏览器类<BR>5.1 判断浏览器的类型<BR>window.navigator.appName<BR>5.2 判断ie的版本<BR>window.navigator.appVersion<BR>5.3 判断客户端的分辨率<BR>window.screen.height; window.screen.width;<BR><BR>6、结合类<BR>6.1 email的判断。<BR>function ismail(mail)<BR>{<BR>return(new RegExp(/^w+((-w+)│(.w+))*@[A-Za-z0-9]+((.│-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$/).test(mail));<BR>}<BR><BR>6.2 手机号码的验证<BR>6.3 身份证的验证<BR>function isIdCardNo(num)<BR>{<BR>if (isNaN(num)) {alert("输入的不是数字！"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">; return false;}<BR>var len = num.length, re; <BR>if (len == 15)<BR>re = new RegExp(/^(d)()?(d)(d)(d)(d)$/);<BR>else if (len == 1<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=8) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/cool.png"><BR>re = new RegExp(/^(d)()?(d)(d)(d)(d)(d)$/);<BR>else {alert("输入的数字位数不对！"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">; return false;}<BR>var a = num.match(re);<BR>if (a != null)<BR>{<BR>if (len==15)<BR>{<BR>var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]);<BR>var B = D.getYear()==a[3]&amp;&amp;(D.getMonth()+1)==a[4]&amp;&amp;D.getDate()==a[5];<BR>}<BR>else<BR>{<BR>var D = new Date(a[3]+"/"+a[4]+"/"+a[5]);<BR>var B = D.getFullYear()==a[3]&amp;&amp;(D.getMonth()+1)==a[4]&amp;&amp;D.getDate()==a[5];<BR>}<BR>if (!B) {alert("输入的身份证号 "+ a[0] +" 里出生日期不对！"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">; return false;}<BR>}<BR>return true;<BR>}<BR>　　　另外一个<BR>&lt;script&gt;<BR>var aCity=<BR><BR>function cidInfo(sId){<BR>var iSum=0<BR>var info=""<BR>if(!/^d(d│x)$/i.test(sId))return false;<BR>sId=sId.replace(/x$/i,"a"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">;<BR>if(aCity[parseInt(sId.substr(0,2))]==null)return "Error:非法地区";<BR>sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2));<BR>var d=new Date(sBirthday.replace(/-/g,"/"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">)<BR>if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "Error:非法生日";<BR>for(var i = 17;i&gt;=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11)<BR>if(iSum%11!=1)return "Error:非法证号";<BR>return aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png"><BR>}<BR><BR>document.write(cidInfo("380524198002300016"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">,"&lt;br/&gt;"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">;<BR>document.write(cidInfo("340524198002300019"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">,"&lt;br/&gt;"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png"><BR>document.write(cidInfo("340524197711111111"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">,"&lt;br/&gt;"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png"><BR>document.write(cidInfo("34052419800101001x"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">,"&lt;br/&gt;"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">;<BR>&lt;/script&gt;<BR>６．４　ｉｐ地址校验<BR>&lt;SCRIPT LANGUAGE="JavaScript"&gt;<BR>function isip(s){<BR>var check=function(v){try{return (v&lt;=255 &amp;&amp; v&gt;=0)}catch(x){return false}};<BR>var re=s.split("."<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png"><BR>return (re.length==4)?(check(re[0]) &amp;&amp; check(re[1]) &amp;&amp; check(re[2]) &amp;&amp; check(re[3])):false<BR>}<BR><BR>var s="202.197.78.129";<BR>alert(isip(s))<BR>&lt;/SCRIPT&gt;<BR>６．５　．加sp1后还能用的无边框窗口！！<BR>&lt;HTML XMLNS:IE&gt;<BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<BR>&lt;IE<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=:D src="http://www.romanfr.com/weblog/templates/default/img/emoticons/laugh.png">ownload ID="include" STYLE="behavior:url(&amp;default;download)" /&gt;<BR>&lt;title&gt;Chromeless Window&lt;/title&gt;<BR><BR>&lt;SCRIPT LANGUAGE="JScript"&gt;<BR>/*--- Special Thanks For andot ---*/<BR><BR>/*<BR>This following code are designed and writen by Windy_sk &lt;seasonx@163.net&gt;<BR>You can use it freely, but u must held all the copyright items!<BR>*/<BR><BR>/*--- Thanks For andot Again ---*/<BR><BR>var CW_width = 400;<BR>var CW_height = 300;<BR>var CW_top = 100;<BR>var CW_left = 100;<BR>var CW_url = "/";<BR>var New_CW = window.createPopup();<BR>var CW_Body = New_CW.document.body;<BR>var content = "";<BR>var CSStext = "margin:1px;color:black; border:2px outset;border-style:expression(onmouseout=onmouseup=function(), onmousedown=function());background-color:buttonface;width:16px;height:14px;font-size:12px;line-height:11px;cursor<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=:D src="http://www.romanfr.com/weblog/templates/default/img/emoticons/laugh.png">efault;";<BR><BR>//Build Window<BR>include.startDownload(CW_url, function(source));<BR><BR>function insert_content(){<BR>var temp = "";<BR>CW_Body.style.overflow = "hidden";<BR>CW_Body.style.backgroundColor = "white";<BR>CW_Body.style.border = "solid black 1px";<BR>content = content.replace(/&lt;a ([^&gt;]*)&gt;/g,"&lt;a onclick='parent.open(this.href);return false' &gt;"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">;<BR>temp += "&lt;table width=100% height=100% cellpadding=0 cellspacing=0 border=0&gt;";<BR>temp += "&lt;tr style=';font-size:12px;background:#0099CC;height:20;cursor:default' ondblclick="Max.innerText=Max.innerText=='1'?'2':'1';parent.if_max=!parent.if_max;parent.show_CW();" onmouseup='parent.drag_up(event)' onmousemove='parent.drag_move(event)' onmousedown='parent.drag_down(event)' onselectstart='return false' oncontextmenu='return false'&gt;";<BR>temp += "&lt;td style='color:#ffffff;padding-left:5px'&gt;Chromeless Window For IE6 SP1&lt;/td&gt;";<BR>temp += "&lt;td style='color:#ffffff;padding-right:5px;' align=right&gt;";<BR>temp += "&lt;span id=Help onclick="alert('Chromeless Window For IE6 SP1 - Ver 1.0\n\nCode By Windy_sk\n\nSpecial Thanks For andot')" style=""+CSStext+"font-family:System;padding-right:2px;"&gt;?&lt;/span&gt;"; <BR><SPAN style="FONT-SIZE: 12px">temp += "&lt;span id=Min onclick='parent.New_CW.hide();parent.blur()' style=""+CSStext+"font-family:Webdings;" title='Minimum'&gt;0&lt;/span&gt;";<BR>temp += "&lt;span id=Max onclick="this.innerText=this.innerText=='1'?'2':'1';parent.if_max=!parent.if_max;parent.show_CW();" style=""+CSStext+"font-family:Webdings;" title='Maximum'&gt;1&lt;/span&gt;";<BR>temp += "&lt;span id=Close onclick='parent.opener=null;parent.close()' style=""+CSStext+"font-family:System;padding-right:2px;" title='Close'&gt;x&lt;/span&gt;";<BR>temp += "&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;";<BR>temp += "&lt;div id=include style='overflow:scroll;overflow-x:hidden;overflow-y:auto; HEIGHT: 100%; width:"+CW_width+"'&gt;";<BR>temp += content;<BR>temp += "&lt;/div&gt;";<BR>temp += "&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;";<BR>CW_Body.innerHTML = temp;<BR>}<BR><BR>setTimeout("insert_content()",1000);<BR><BR>var if_max = true;<BR>function show_CW(){<BR>window.moveTo(10000, 10000);<BR>if(if_max){<BR>New_CW.show(CW_top, CW_left, CW_width, CW_height);<BR>if(typeof(New_CW.document.all.include)!="undefined"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">{<BR>New_CW.document.all.include.style.width = CW_width;<BR>New_CW.document.all.Max.innerText = "1";<BR>}<BR><BR>}else{<BR>New_CW.show(0, 0, screen.width, screen.height);<BR>New_CW.document.all.include.style.width = screen.width;<BR>}<BR>}<BR><BR>window.onfocus = show_CW;<BR>window.onresize = show_CW;<BR><BR>// Move Window<BR>var drag_x,drag_y,draging=false<BR><BR>function drag_move(e){<BR>if (draging){<BR>New_CW.show(e.screenX-drag_x, e.screenY-drag_y, CW_width, CW_height);<BR>return false;<BR>}<BR>}<BR><BR>function drag_down(e){<BR>if(e.button==2)return;<BR>if(New_CW.document.body.offsetWidth==screen.width &amp;&amp; New_CW.document.body.offsetHeight==screen.height)return;<BR>drag_x=e.clientX;<BR>drag_y=e.clientY;<BR>draging=true;<BR>e.srcElement.setCapture();<BR>}<BR><BR>function drag_up(e){<BR>draging=false;<BR>e.srcElement.releaseCapture();<BR>if(New_CW.document.body.offsetWidth==screen.width &amp;&amp; New_CW.document.body.offsetHeight==screen.height) return;<BR>CW_top = e.screenX-drag_x;<BR>CW_left = e.screenY-drag_y;<BR>}<BR><BR>&lt;/SCRIPT&gt;<BR>&lt;/HTML&gt;<BR><BR>６．６　电话号码的验证<BR><BR>要求：<BR>　　(1)电话号码由数字、"("、"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">"和"-"构成<BR>　　(2)电话号码为3到8位<BR>　　(3)如果电话号码中包含有区号，那么区号为三位或四位<BR>　　(4)区号用"("、"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">"或"-"和其他部分隔开<BR>　　(5)移动电话号码为11或12位，如果为12位,那么第一位为0<BR>　　(6)11位移动电话号码的第一位和第二位为"13"<BR>　　(7)12位移动电话号码的第二位和第三位为"13"<BR>　　根据这几条规则，可以与出以下正则表达式：<BR>　　(^[0-9]-[0-9]$)│(^[0-9]$)│(^([0-9])[0-9]$)│(^013[0-9]$)<BR><BR><BR>&lt;script language="javascript"&gt;<BR>function PhoneCheck(s) {<BR>var str=s;<BR>var reg=/(^[0-9]-[0-9]$)│(^[0-9]$)│(^([0-9])[0-9]$)│(^013[0-9]$)/<BR>alert(reg.test(str));<BR>}<BR>&lt;/script&gt;<BR>&lt;input type=text name="iphone"&gt;<BR>&lt;input type=button onclick="PhoneCheck(document.all.iphone.value)" value="Check"&gt;<BR><BR>二、功能类<BR><BR>1、时间与相关控件类<BR>1.1 日历<BR>精华区的日历<BR><BR>1.2 时间控件<BR><BR>1.3 万年历<BR><A onmouseover="window.status='http://202.112.86.128/studentspace/...calendars/rili/';return true;" title=http://202.112.86.128/studentspace/...calendars/rili/ onmouseout="window.status='';return true;" href="http://www.romanfr.com/weblog/exit.php?url=aHR0cDovLzIwMi4xMTIuODYuMTI4L3N0dWRlbnRzcGFjZS8uLi5jYWxlbmRhcnMvcmlsaS8=&amp;entry_id=125" target=_blank><FONT color=#003366>http://202.112.86.128/studentspace/...calendars/rili/</FONT></A><BR>1.4 显示动态显示时钟效果（文本，如OA中时间）<BR>特效很容易找到的<BR>1.5 显示动态显示时钟效果 (图像，像手表) <BR>特效很容易找到的<BR>2、表单类<BR>2.1 自动生成表单<BR>2.2 动态添加，修改，删除下拉框中的元素<BR>大版主的ｊｓ宝库里面的对select 的操作已经可以是精品了。<BR>2.3 可以输入内容的下拉框<BR><BR>2.4 多行文本框中只能输入iMax文字。如果多输入了，自动减少到iMax个文字（多用于短信发送)<BR><BR>3、打印类<BR>3.1 打印控件<BR>&lt;HTML&gt;<BR>&lt;HEAD&gt;<BR>&lt;TITLE&gt; New Document &lt;/TITLE&gt;<BR>&lt;META NAME="Generator" CONTENT="EditPlus"&gt;<BR>&lt;META NAME="Author" CONTENT=""&gt;<BR>&lt;META NAME="Keywords" CONTENT=""&gt;<BR>&lt;META NAME="Description" CONTENT=""&gt;<BR>&lt;SCRIPT LANGUAGE=javascript&gt;<BR>&lt;!--<BR>function setPrint()<BR><BR>function previewPrint()<BR><BR><BR>//--&gt;<BR>&lt;/SCRIPT&gt;<BR>&lt;script language=vbscript&gt;<BR>function setup_page<BR>Dim wsh<BR>Set wsh = CreateObject("WScript.Shell"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png"><BR>on error resume next<BR><BR>wsh.RegWrite "HKCUSoftwareMicrosoftInternet explorerPageSetupheader", "", "REG_SZ"<BR>wsh.RegWrite "HKCUSoftwareMicrosoftInternet ExplorerPageSetupfooter", "", "REG_SZ"<BR><BR>end function<BR><BR>&lt;/script&gt; <BR>&lt;/HEAD&gt;<BR><BR>&lt;BODY&gt;<BR>&lt;OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WB width=0&gt;<BR>&lt;/OBJECT&gt;<BR>&lt;INPUT type="button" value="Set" id=button1 name=button1 onclick="setPrint();"&gt;<BR>&lt;INPUT type="button" value="Preview" id=button2 name=button2 onclick="previewPrint();"&gt;<BR>&lt;INPUT type="button" value="setup" id=button2 name=button2 onclick="setup_page();"&gt;<BR>&lt;/BODY&gt;<BR>&lt;/HTML&gt;<BR><BR>4、事件类<BR>4.1 屏蔽右键<BR>4.2 屏蔽所有功能键<BR>4.3 --&gt; 和&lt;-- F5 F11,F9,F1<BR>4.4 屏蔽组合键ctrl+N<BR>&lt;script&gt;<BR>//禁止ctrl+n和 禁止ctrl+r和 禁止shift+f10 禁止鼠标右键or左右键 和禁止f5<BR>var oLastBtn=0,bIsMenu=false <BR>if (window.Event)<BR>{<BR>document.captureEvents(Event.MOUSEUP); <BR>}<BR><BR>function nocontextmenu()<BR>{ <BR>event.cancelBubble=true;<BR>event.returnValue=false; <BR>return false; <BR>}<BR><BR>function norightclick(e) <BR><BR>{ <BR>if(window.Event) <BR>{ <BR>if (e.which !=1)<BR>{<BR>return false; <BR>}<BR>} <BR>else <BR>if(event.button!=1) <BR>{ <BR>event.cancelBubble=true;<BR>event.returnValue=false; <BR>return false; <BR>} <BR>}<BR><BR>document.oncontextmenu=nocontextmenu; <BR>document.onmousedown=norightclick; <BR><BR>function onKeyDown()<BR>{<BR>if ((event.altKey)││((event.keyCode==<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=8) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/cool.png">&amp;&amp;(event.srcElement.type!="text"&amp;&amp;event.srcElement.type!="textarea"&amp;&amp;event.srcElement.type!="password"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">)││((event.ctrlKey)&amp;&amp;((event.keyCode==7<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=8) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/cool.png">││(event.keyCode==82)))││(event.keyCode==116))<BR><BR>}<BR>&lt;/script&gt;<BR>&lt;body onkeydown="onKeyDown()"&gt;<BR>&lt;body&gt;<BR>&lt;/html&gt;<BR>5、网页设计类<BR>5.1 连续滚动的文字，图片（注意是连续的，两段文字和图片中没有空白出现）<BR>5.2 html编辑控件类<BR>5.3 颜色选取框控件<BR>5.4 下拉菜单<BR>5.5 两层或多层次的下拉菜单<BR>5.6 仿IE菜单的按钮。（效果如rongshuxa.com的导航栏目)<BR>5.7 状态栏，title栏的动态效果（例子很多，可以研究一下）<BR>5.8 双击后，网页自动滚屏<BR>以上都是特效类，很容易找到的。<BR>6、树型结构。<BR>6.1 asp+SQL版<BR>6.2 asp+xml+sql版<BR>6.3 java+sql或者java+sql+xml<BR>7、无边框效果的制作<BR>8、连动下拉框技术<BR>9、文本排序<BR>10，画图类，含饼、柱、矢量贝滋曲线<BR>&lt;OBJECT <BR>id=S <BR>style="LEFT: 0px; WIDTH: 392px; TOP: 0px; HEIGHT: 240px" <BR>height=240 <BR>width=392 <BR>classid="clsid:369303C2-D7AC-11D0-89D5-00A0C90833E6"&gt;<BR>&lt;/OBJECT&gt;<BR>&lt;SCRIPT&gt;<BR>S.DrawingSurface.ArcDegrees(0,0,0,30,50,60);<BR>S.DrawingSurface.ArcRadians(30,0,0,30,50,60);<BR>S.DrawingSurface.Line(10,10,100,100);<BR>&lt;/SCRIPT&gt;<BR><BR><BR>11，操纵客户端注册表类<BR>&lt;SCRIPT&gt;<BR>var WshShell = WScript.CreateObject("WScript.Shell"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">;<BR>WshShell.RegWrite ("HKCU\Software\ACME\FortuneTeller\", 1, "REG_BINARY"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">;<BR>WshShell.RegWrite ("HKCU\Software\ACME\FortuneTeller\MindReader", "Goocher!", "REG_SZ"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">;<BR>var bKey = WshShell.RegRead ("HKCU\Software\ACME\FortuneTeller\"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">;<BR>WScript.Echo (WshShell.RegRead ("HKCU\Software\ACME\FortuneTeller\MindReader"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">);<BR>WshShell.RegDelete ("HKCU\Software\ACME\FortuneTeller\MindReader"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">;<BR>WshShell.RegDelete ("HKCU\Software\ACME\FortuneTeller\"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">;<BR>WshShell.RegDelete ("HKCU\Software\ACME\"<IMG class=emoticon style="DISPLAY: inline; VERTICAL-ALIGN: bottom" alt=;) src="http://www.romanfr.com/weblog/templates/default/img/emoticons/wink.png">;<BR>&lt;/SCRIPT&gt;<BR><BR>12，DIV层相关（拖拽、显示、隐藏、移动、增加）<BR>13，TABLAE相关(客户端动态增加行列，模拟进度条，滚动列表等)<BR>&lt;HTML&gt;<BR>&lt;SCRIPT LANGUAGE="JScript"&gt;<BR>function numberCells() {<BR>var count=0;<BR>for (i=0; i &lt; document.all.mytable.rows.length; i++) {<BR>for (j=0; j &lt; document.all.mytable.rows(i).cells.length; j++) {<BR>document.all.mytable.rows(i).cells(j).innerText = count;<BR>count++;<BR>}<BR>}<BR>}<BR>&lt;/SCRIPT&gt;<BR>&lt;BODY onload="numberCells()"&gt;<BR>&lt;TABLE id=mytable border=1&gt;<BR>&lt;TR&gt;&lt;TH&gt; &lt;/TH&gt;&lt;TH&gt; &lt;/TH&gt;&lt;TH&gt; &lt;/TH&gt;&lt;TH&gt; &lt;/TH&gt;&lt;/TR&gt;<BR>&lt;TR&gt;&lt;TD&gt; &lt;/TD&gt;&lt;TD&gt; &lt;/TD&gt;&lt;TD&gt; &lt;/TD&gt;&lt;TD&gt; &lt;/TD&gt;&lt;/TR&gt;<BR>&lt;TR&gt;&lt;TD&gt; &lt;/TD&gt;&lt;TD&gt; &lt;/TD&gt;&lt;TD&gt; &lt;/TD&gt;&lt;TD&gt; &lt;/TD&gt;&lt;/TR&gt;<BR>&lt;/TABLE&gt;<BR>&lt;/BODY&gt;<BR>&lt;/HTML&gt; <BR>14，各种&lt;object classid=&gt;相关类，如播放器，flash与脚本互动等<BR>16, 刷新/模拟无刷新 异步调用类（XMLHttp或iframe,frame）</SPAN>]]></description>
</item><item>
<title><![CDATA[正则基础]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=5243</link>
<author>summer_smile</author>
<pubDate>2005/4/24 0:32:00</pubDate>
<description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent> 
<P>1、“.”为通配符，表示任何一个字符，例如：“a.c”可以匹配“anc”、“abc”、“acc”；<BR>2、“[]”，在[]内可以指定要求匹配的字符，例如：“a[nbc]c”可以匹配“anc”、“abc”、“acc”</P>
<P>；但不可以匹配“ancc”,a到z可以写成[a-z],0到9可以写成[0-9];</P>
<P>3、数量限定符号，表示匹配次数（或者叫做长度）的符号：</P>
<P>包括：“*”——0次或者多次<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; “+”——1次或者多次<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; “?”——0次或者1次<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; “{n}”——匹配n次，n为整数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; “{n,m}”——匹配从n到m之间的某个数的次数；n和m都是整数；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; “{n,}”——匹配n到无穷次之间任意次数；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; “{,m}”——匹配0到m之间任意次数；<BR>他们放到匹配格式的后面：<BR>例如：<BR>电话号码：024－84820482，02484820482(假设前面3或者4位，后面7或者8位，并且中间的减号可有可无)</P>
<P>都是符合规定的，那么可以用如下格式来匹配：[0-9]{3,4} \-? [0-9]{7,8}；<BR>注意：“\”为转义字符，因为“-”在正则表达式用有代表一个范围的意义，例如：前面所说的[0-9]，</P>
<P>所以它需要转义字符“\”进行转义才可使用；<BR>4、“^”为否符号，表示不想匹配的符号，例如：[^z][a-z]+可以匹配所有除“z”开头的以外的所有字</P>
<P>符串（长度大于2，因为“+”表示大于等于1的次数，从第二位开始都是小写英文字符）；<BR>如果^放到[]的外边则表示以[]开头的字符串；^[az][a-z]+表示a或者z开头的长度大于等于2的英文字符</P>
<P>串；<BR>5、“|”或运算符，例如：a[n|bc|cb]c可以匹配“abcc”,“anc”,“acbc”；<BR>6、“$”以它前面的字符结尾的；例如：ab+$就可以被“abb”，“ab”匹配；<BR>7、一些简单表示方法：<BR>\d表示[0-9];\D表示[^0-9];\w表示[A-Z0-9];\W表示[^A-Z0-9];\s表示[\t\n\r\f],就是空格字符包括tab</P>
<P>，空格等等;\S表示[^\t\n\r\f]，就是非空格字符;<BR>8、常用的匹配：<BR>匹配中文字符： “[\u4e00-\u9fa5]”；<BR>匹配双字节字符(包括汉字在内)：“[^\x00-\xff]”；<BR>匹配空行的正则表达式：“\n[\s| ]*\r”；<BR>匹配HTML标记的正则表达式：“/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/”；<BR>匹配首尾空格的正则表达式：“(^\s*)|(\s*$)”；<BR>匹配非负整数（正整数 + 0）：“^\d+$”；　　 <BR>匹配正整数：“^[0-9]*[1-9][0-9]*$”； <BR>匹配非正整数（负整数 + 0）：“^((-\d+)|(0+))$”；<BR>匹配负整数：“^-[0-9]*[1-9][0-9]*$”；<BR>匹配整数：“^-?\d+$”；<BR>匹配非负浮点数（正浮点数 + 0）：“^\d+(\.\d+)?$”<BR>匹配正浮点数：“^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*</P>
<P>))$”；<BR>^((-\d+(\.\d+)?)|(0+(\.0+)?))$　　//匹配非正浮点数（负浮点数 + 0） <BR>^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$　　//匹配</P>
<P>负浮点数 <BR>匹配浮点数：“^(-?\d+)(\.\d+)?$”；<BR>匹配由数字、26个英文字母或者下划线组成的字符串：“^\w+$”；<BR>匹配email地址：“^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$”；<BR>匹配url：“^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$”</P></SPAN>]]></description>
</item><item>
<title><![CDATA[解析文本数据文件]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=5242</link>
<author>summer_smile</author>
<pubDate>2005/4/24 0:28:29</pubDate>
<description><![CDATA[三、解析文本数据文件 <BR><BR>　　数据文件的格式和种类很多，XML文档、结构化文本甚至非结构化文本都经常成为ASP应用的数据源。下面我们要看的一个例子是使用限定符的结构化文本文件。限定符（比如引号）表示字符串各个部分不可分割，即使字符串内部包含把记录分隔成字段的分隔符也一样。 <BR><BR>　　下面是一个简单的结构化文本文件： <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>姓,名, 电话, 说明<BR>孙,悟空, 312 555 5656, ASP很好<BR>猪,八戒, 847 555 5656, 我是电影制片人</TD></TR></TBODY></TABLE><BR>　　这个文件非常简单，它的第一行是标题，下面两行是用逗号作为分隔符的记录。要解析这个文件也很简单，只需先把文件分割成行（根据换行符号），然后把各个记录按照字段分割。但是，如果我们在某个字段内容中加入了逗号： <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>姓,名, 电话, 说明<BR>孙,悟空, 312 555 5656, 我喜欢ASP,还有VB和SQL<BR>猪,八戒, 847 555 5656, 我是电影制片人</TD></TR></TBODY></TABLE><BR>　　解析第一个记录时就会出现问题，因为在只认可逗号分隔符的解析器看来它的最后一个字段包含了两个字段的内容。为了避免出现这类问题，包含分隔符的字段必须用限定符包围。单引号就是一种常用的限定符。把上面的文本文件加上单引号限定符之后，它的内容如下所示： <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>姓,名, 电话, 说明<BR>孙,悟空, 312 555 5656, '我喜欢ASP,还有VB和SQL'<BR>猪,八戒, 847 555 5656, '我是电影制片人'</TD></TR></TBODY></TABLE><BR>　　现在我们能够肯定哪一个逗号是分隔符、哪一个逗号是字段内容了，即只需把引号内部出现的逗号视为字段的内容。接下来我们要做的就是实现一个正则表达式解析器，由这个解析器确定何时根据逗号分割字段、何时把逗号视为字段内容。 <BR><BR>　　这里的问题与大多数正则表达式所面临的略有不同。通常我们查看的是文本的一小部分，看看它是否能够和正则表达式匹配。但在这里，只有考虑了整行文本之后我们才能可靠地判断出哪些内容位于引号之内。 <BR><BR>　　下面是一个说明该问题的例子。从某个文本文件随意抽取半行内容，得到：1, 沙滩, 黑色, 21, ', 狗, 猫, 鸭子, ', 。在这个例子中，因为“1”的左边还有其他数据，要解析清楚它的内容是极其困难的。我们不知道这个数据片断的前面有多少单引号，从而也就无法判断哪些字符位于引号之内（在引号之内的文本解析时不能分割）。如果这个数据片断之前有偶数个（或者没有）单引号，那么“', 狗, 猫, 鸭子, '”是用引号界定的字符串且不可分割。如果前面的引号数量是奇数，那么“1, 沙滩, 黑色, 21, '”是某个字符串的结束部分且不可分割。 <BR><BR>　　因此，正则表达式必须分析整行文本，全面考虑出现了多少引号才能确定字符是处在引号对的内部还是外部，即：,(?=([^']*'[^']*')*(?![^']*'))。这个正则表达式首先找到一个引号，然后继续查找并保证逗号后面的单引号数量或者是偶数、或者是0。该正则表达式以下面这个判断为基础：如果逗号后面的单引号数量是偶数，那么这个逗号位于字符串之外。下表给出了更详细的说明： <BR><BR>
<TABLE cellSpacing=0 cols=2 borderColorDark=#ffffff cellPadding=5 width="80%" align=center borderColorLight=black border=1 rows="9">
<TBODY>
<TR>
<TD>, </TD>
<TD>寻找一个逗号 </TD></TR>
<TR>
<TD>(?= </TD>
<TD>继续向前查找以匹配下面这个模式： </TD></TR>
<TR>
<TD>( </TD>
<TD>开始一个新的模式 </TD></TR>
<TR>
<TD>[^']*' </TD>
<TD>[非引号字符]0个或者多个，然后是一个引号 </TD></TR>
<TR>
<TD>[^']*'[^']*) </TD>
<TD>[非引号字符]0个或者多个，然后是一个引号。结合前面的内容之后它匹配引号对 </TD></TR>
<TR>
<TD>)* </TD>
<TD>结束模式并匹配整个模式（引号对）0次或者多次 </TD></TR>
<TR>
<TD>(?! </TD>
<TD>向前查找，排除此模式 </TD></TR>
<TR>
<TD>[^']*' </TD>
<TD>[非引号字符]0个或者多个，然后是一个引号 </TD></TR>
<TR>
<TD>) </TD>
<TD>结束模式 </TD></TR></TBODY></TABLE><BR>　　下面是一个VBScript函数，它接受一个字符串参数，根据字符串中的逗号分隔符、单引号限定符分割字符串，返回结果数组： <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>Function SplitAdv(strInput)<BR>Dim objRE<BR>Set objRE = new RegExp<BR><BR>' 设置RegExp对象<BR>objRE.IgnoreCase = true<BR>objRE.Global = true<BR>objRE.Pattern = ",(?=([^']*'[^']*')*(?![^']*'))"<BR><BR>' Replace方法用chr(8)替换我们要用到的逗号，chr(8)即\b<BR>' 字符，\b在字符串中出现的可能极为微小。<BR>' 然后我们根据\b把字符串分割保存到数组<BR>SplitAdv = Split(objRE.Replace(strInput, "\b"), "\b")<BR>End Function</TD></TR></TBODY></TABLE><BR>　　总而言之，用正则表达式解析文本数据文件具有高效、缩短开发时间的优点，能够节省大量分析文件、根据复杂的条件提取有用数据的时间。在一个迅速发展的环境中仍会有许多传统的数据可资利用，掌握如何构造高效的数据分析例程将是一种宝贵的技能。 <BR><BR>　　四、字符串替换 <BR><BR>　　在最后一个例子中我们要看看VBScript正则表达式的替换功能。ASP经常用于动态地格式化从各种数据源获得的文本。利用VBScript正则表达式的强大功能，ASP能够动态地改变匹配的复杂文本。通过加入HTML标记突出显示部分单词就是一种常见的应用，比如突出显示搜索结果中的搜索关键词。 <BR><BR>　　为说明实现方法，下面我们来看一个突出显示字符串中所有“.NET”的例子。这个字符串可以从任何地方获得，比如数据库或者其他Web网站。 <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>＜%<BR>Set regEx = New RegExp<BR>regEx.Global = true<BR>regEx.IgnoreCase = True<BR><BR>' 正则表达式模式，<BR>' 寻找任何结尾为“.NET”的单词或者URL。<BR>regEx.Pattern = "(\b[a-zA-Z\._]+?\.NET\b)"<BR><BR>' 用于测试替换功能的字符串<BR>strText = "微软建立了一个新网站www.ASP.NET。"<BR><BR>' 调用正则表达式的Replace方法<BR>' $1表示把匹配的文本插入当前位置<BR>Response.Write regEx.Replace(strText, _<BR>"＜b style='color: #000099; font-size: 18pt'＞$1＜/b＞")<BR>%＞</TD></TR></TBODY></TABLE><BR>　　这个例子中有几个重要的地方必须注意。整个正则表达式被放入了一对圆括号中，它的作用是截取所有匹配的内容供以后使用，这些内容在替换文本中通过$1引用。类似的截取每次替换可以使用多达9个，分别通过$1到$9引用。正则表达式的Replace方法和VBScript本身的Replace函数不同，它只需要两个参数：被搜索的文本，替换用的文本。 <BR><BR>　　在这个例子中，为了突出显示搜索到的“.NET”字符串，我们用粗体标记以及其他样式属性来包围这些字符串。使用这种搜索和替换技术，我们能够方便地为网站搜索程序加上突出显示搜索关键词的功能，或者自动为页面中出现的关键词加上指向其他页面的链接。 <BR><BR>　　结束语<BR><BR>　　希望本文介绍的几种正则表达式技巧对你在何时、如何应用正则表达式有所启发。虽然本文的例子用VBScript编写，但在ASP.NET中正则表达式同样也大有用武之地，它是服务器端控件表单检验的主要机制之一，而且通过System.Text.RegularExpressions命名空间导出到了整个.NET框架之中]]></description>
</item><item>
<title><![CDATA[提取页面特定部分]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=5241</link>
<author>summer_smile</author>
<pubDate>2005/4/24 0:27:05</pubDate>
<description><![CDATA[二、提取HTML页面的特定部分 <BR><BR>　　从HTML页面提取内容所面临的主要问题是，我们必须寻找一种方法精确地识别出自己想要的那一部分内容。例如，下面是一个显示新闻标题的HTML代码片断： <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>＜table border="0" width="11%" class="Somestory"＞<BR>＜tr＞<BR>＜td width="100%"＞<BR>＜p align="center"＞其他内容...＜/td＞<BR>＜/tr＞<BR>＜/table＞<BR>＜table border="0" width="11%" class="Headline"＞<BR>＜tr＞<BR>＜td width="100%"＞<BR>＜p align="center"＞伊拉克战争！＜/td＞<BR>＜/tr＞<BR>＜/table＞<BR>＜table border="0" width="11%" class="Someotherstory"＞<BR>＜tr＞<BR>＜td width="100%"＞<BR>＜p align="center"＞其他内容...＜/td＞<BR>＜/tr＞<BR>＜/table＞</TD></TR></TBODY></TABLE><BR>　　观察上述代码，很容易看出新闻标题由位于中间的表格显示，它的class属性设置为Headline。如果HTML页面非常复杂，使用Microsoft IE从5.0开始提供的一项附加功能可以只查看被选中部分页面的HTML代码，请访问http://www.microsoft.com/Windows/ie/WebAccess/default.ASP了解详情。对于本例，我们假定这是唯一class属性设置为Headline的表格。现在我们要创建正则表达式，通过正则表达式找到这个Headline表格并把这个表格包含到自己的页面中。首先是编写支持正则表达式的代码： <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>＜%<BR>Dim re, strHTML<BR>Set re = new RegExp ' 创建正则表达式对象<BR><BR>re.IgnoreCase = true<BR>re.Global = false ' 第一次匹配之后结束查找<BR>%＞</TD></TR></TBODY></TABLE><BR>　　下面考虑一下我们要提取的区域：在这里，我们要提取的是整个＜table＞结构，包括结束标记和新闻标题的文本。因此查找的起始字符应该是＜table＞开始标记： re.Pattern = "＜table.*(?=Headline)"。这个正则表达式匹配表格的开始标记，能够返回开始标记直至“Headline”之间的所有内容（换行除外）。下面是返回已匹配HTML代码的方法： <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>' 把所有匹配的HTML代码放入Matches集合<BR>Set Matches = re.Execute(strHTML)<BR><BR>' 显示所有匹配的HTML代码<BR>For Each Item in Matches<BR>Response.Write Item.Value<BR>Next<BR><BR>' 显示其中一项<BR>Response.write Matches.Item(0).Value</TD></TR></TBODY></TABLE><BR>　　运行这段代码处理前面显示的HTML片断，正则表达式返回一次匹配的内容如下： ＜table border="0" width="11%" class="。正则表达式中的“(?=Headline)”没有获取字符，所以不能看到表格class属性的值。要获取表格剩余部分的代码也相当简单： re.Pattern = "＜table.*(?=Headline)(.|\n)*?＜/table＞"。其中：“(.|\n)”后面的“*”匹配0个到多个任意字符；而“？”使得“*”匹配范围最小化，即在找到表达式的下一部分之前匹配尽可能少的字符。＜/table＞是表格的结束标记。 <BR><BR>　　“?”限制符非常重要，它防止了表达式返回其他表格的代码。例如对于前面给出的HTML代码片断，如果删除这个“?”则返回内容将是： <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>＜table border="0" width="11%" class="Headline"＞<BR>＜tr＞<BR>＜td width="100%"＞<BR>＜p align="center"＞伊拉克战争！＜/td＞<BR>＜/tr＞<BR>＜/table＞<BR>＜table border="0" width="11%" class="Someotherstory"＞<BR>＜tr＞<BR>＜td width="100%"＞<BR>＜p align="center"＞其他内容...＜/td＞<BR>＜/tr＞<BR>＜/table＞</TD></TR></TBODY></TABLE>
<P><BR>　　返回的内容不仅包含了Headline表的＜table＞标记，而且还包含了Someotherstory表格，由此可以看出，这里的“?”是必不可少的。 <BR><BR>　　本例假设了一些相当理想化的前提。实际应用中情况往往要复杂得多，特别是你对正在使用的源HTML代码的编写没有任何影响力时，编写ASP代码尤为困难。最有效的方法是，多花些时间分析待提取内容附近的HTML，经常地测试，确保提取出来的内容正是自己所需要的。另外，应当重视并处理正则表达式不能匹配源HTML页面任何内容的情形。内容的更新可能非常快速，不要只因为别人改变了内容的格式而让自己的页面出现低级可笑的错误。 <BR></P>]]></description>
</item><item>
<title><![CDATA[正则表达式收集]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=5240</link>
<author>summer_smile</author>
<pubDate>2005/4/24 0:22:17</pubDate>
<description><![CDATA[匹配中文字符的正则表达式： [\u4e00-\u9fa5]<BR><BR>匹配双字节字符(包括汉字在内)：[^\x00-\xff]<BR><BR>应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）<BR><BR>String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}<BR><BR>匹配空行的正则表达式：\n[\s| ]*\r<BR><BR>匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/ <BR><BR>匹配首尾空格的正则表达式：(^\s*)|(\s*$)<BR><BR>应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现，如下：<BR><BR>String.prototype.trim = function()<BR>{<BR>return this.replace(/(^\s*)|(\s*$)/g, "");<BR>}<BR><BR>利用正则表达式分解和转换IP地址：<BR><BR>下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序：<BR><BR>function IP2V(ip)<BR>{<BR>re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式<BR>if(re.test(ip))<BR>{<BR>return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1<BR>}<BR>else<BR>{<BR>throw new Error("Not a valid IP address!")<BR>}<BR>}<BR><BR>不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下：<BR><BR>var ip="10.100.20.168"<BR>ip=ip.split(".")<BR>alert("IP值是："+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))<BR><BR>匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*<BR><BR>匹配网址URL的正则表达式：http://([\w-]+\.)+[\w-]+(/[\w- ./?%&amp;=]*)?<BR><BR>利用正则表达式去除字串中重复的字符的算法程序：[注：此程序不正确，原因见本贴回复]<BR><BR>var s="abacabefgeeii"<BR>var s1=s.replace(/(.).*\1/g,"$1")<BR>var re=new RegExp("["+s1+"]","g")<BR>var s2=s.replace(re,"") <BR>alert(s1+s2) //结果为：abcefgi<BR><BR>我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法，最终没有找到，这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符，再以重复的字符建立第二个表达式，取到不重复的字符，两者串连。这个方法对于字符顺序有要求的字符串可能不适用。<BR><BR>得用正则表达式从URL地址中提取文件名的javascript程序，如下结果为page1<BR><BR>s="http://www.9499.net/page1.htm"<BR>s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")<BR>alert(s)<BR><BR>利用正则表达式限制网页表单里的文本框输入内容：<BR><BR>用正则表达式限制只能输入中文：onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"<BR><BR>用正则表达式限制只能输入全角字符： onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"<BR><BR>用正则表达式限制只能输入数字：onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"<BR><BR>用正则表达式限制只能输入数字和英文：onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" 
<P align=right>出处：<A href="http://www.blueidea.com/">蓝色理想</A></P>]]></description>
</item><item>
<title><![CDATA[scrom标准，4本大厚书]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=4737</link>
<author>summer_smile</author>
<pubDate>2005/4/10 13:03:03</pubDate>
<description><![CDATA[花了一百多，打印了几本大厚书，看了两本，对这个标准有了一个比较深入的认识。但还没有彻底弄明白。不知道对于国内来说，它的趋势是如何的。希望能有所作为，这样我就没白花钱了。]]></description>
</item><item>
<title><![CDATA[mysql4.1 的问题]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=4420</link>
<author>summer_smile</author>
<pubDate>2005/4/2 15:24:17</pubDate>
<description><![CDATA[其一: <BR>mysql&gt; SET PASSWORD FOR <BR>-&gt; 'some_user'@'some_host' = OLD_PASSWORD('newpwd'); <BR><BR>其二: <BR>mysql&gt; UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd') <BR>-&gt; WHERE Host = 'some_host' AND User = 'some_user'; <BR>mysql&gt; FLUSH PRIVILEGES; <BR>]]></description>
</item><item>
<title><![CDATA[.net 's hibernate]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=4373</link>
<author>summer_smile</author>
<pubDate>2005/4/2 10:48:18</pubDate>
<description><![CDATA[<A href="http://www.mertner.com/confluence/homepage.action">http://www.mertner.com/confluence/homepage.action</A>]]></description>
</item><item>
<title><![CDATA[[收藏]XSLT2.0新特性体验之一——分组的简化[原创] -- 作者：doubleG]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=4370</link>
<author>summer_smile</author>
<pubDate>2005/4/2 9:37:04</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=8&amp;ID=16265&amp;replyID=42964&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=doubleG" target=_blank>doubleG</A><BR>以下为原文：<BR><BR><B>XSLT2.0新特性体验之一——分组的简化[原创]</B><BR><BR>XSLT2.0已经出来时间不短了，由于时间关系一直没有好好去看，最近抽点时间和大家一起讨论一下喽:)<BR>XSLT2.0相比1.0增加了五个比较激动人心的功能<BR>今天就来看看第一个：支持分组了。在1.0中我们要对XML分组虽然可以使用很多方式，但是就算最出名的Muenchian虽然灵巧但是其复杂耗内存的方法并不受人们的推崇，在2.0中有了直接的支持，使得XML中的分组不再令人生畏，下面我们就来比较一下1.0和2.0中的分组：<BR>数据文件：node.xml<BR>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<BR>&lt;?xml:stylesheet type="text/xsl" href="1.xsl"?&gt;<BR>&lt;root&gt;<BR>&lt;node a="a1" b="b1"/&gt;<BR>&lt;node a="a2" b="b1"/&gt;<BR>&lt;node a="a2" b="b2"/&gt;<BR>&lt;node a="a3" b="b2"/&gt;<BR>&lt;/root&gt;<BR>目标结果输出：<BR>The a: a1 a2 a3 <BR>The b: b1 b2 
<P></P>
<P><BR>在1.0中没有直接的分组功能必须自己想办法来进行处理，我就拿Muenchian方法来做例子了（毕竟是最灵巧的方法，呵呵）<BR>1.xsl(1.0版）：<BR>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<BR>&lt;xsl:stylesheet version="1.0" xmlns:xsl="<A class=contentlink href='http://www.w3.org/1999/XSL/Transform"' target=_blank>http://www.w3.org/1999/XSL/Transform"</A> xmlns:fo="<A class=contentlink href='http://www.w3.org/1999/XSL/Format">' target=_blank>http://www.w3.org/1999/XSL/Format"&gt;</A><BR>&lt;xsl:key name="nodeA" match="node" use="@a"/&gt;<BR>&lt;xsl:key name="nodeB" match="node" use="@b"/&gt;<BR>&lt;xsl:template match="root"&gt;<BR>The a:<BR>&lt;xsl:for-each select="./node[generate-id(.)=generate-id(key('nodeA',@a))]"&gt;<BR>&lt;xsl:<I>value</I>-of select="@a"/&gt;&amp;#160;<BR>&lt;/xsl:for-each&gt;<BR>&lt;br/&gt;<BR>The b:<BR>&lt;xsl:for-each select="./node[generate-id(.)=generate-id(key('nodeB',@b))]"&gt;<BR>&lt;xsl:<I>value</I>-of select="@b"/&gt;&amp;#160;</P>
<P>&lt;/xsl:for-each&gt;<BR>&lt;/xsl:template&gt;<BR>&lt;/xsl:stylesheet&gt;</P>
<P>设定两个key值，一个名字为nodeA,一个为nodeB。他们分别都是对于node这个节点进行分组设定的，只是分组所使用的内容不同，nodeA使用的是node的a属性，nodeB使用的是b属性。<BR>generate-id(node-set):<BR>The generate-id function returns a string that uniquely identifies the node in the argument node-set that is first in document order. <BR>该函数会返回节点在整个文档中的唯一标识。<BR>node-set key(string, object)<BR>第一个参数是key名字，就是前面定义的&lt;xsl:key的名字，object表示那个内容和key中的内容进行匹配，key('nodeA',@a)就是返回了第一个和当前节点的匹配内容相同的文档中的节点。<BR>在上述的xsl中，我们添加进这样一段<BR>&lt;xsl:for-each select="./node"&gt;<BR>&lt;xsl:<I>value</I>-of select="generate-id(.)"/&gt;&amp;#160;<BR>&lt;xsl:<I>value</I>-of select="generate-id(key('nodeA',@a))"/&gt;<BR>&lt;br/&gt;<BR>&lt;/xsl:for-each&gt;<BR>可以看到输出值是<BR>IDAWHIYF IDAWHIYF<BR>IDAZHIYF IDAZHIYF<BR>IDA2HIYF IDAZHIYF<BR>IDATGIYF IDATGIYF<BR>可以看到空格前的四个数据是完全不相同的，也就是每一个节点的唯一标示，使随机生成并没有固定值，但空格后的数据第二个和第三个是相同的。我们可以看一下xml数据的第二个和第三个节点：<BR>&lt;node a="a2" b="b1"/&gt;<BR>&lt;node a="a2" b="b2"/&gt;<BR>他们的a属性是相同，所以说明key('nodeA',@a)在处理到第三个节点&lt;node a="a2" b="b2"/&gt;时返回的是符合key的第一个节点，也就是&lt;node a="a2" b="b1"/&gt;。<BR>通过这种"./node[generate-id(.)=generate-id(key('nodeA',@a))]"方式就剔除重复的内容，达到了分组效果，解析结果就是：<BR>The a: a1 a2 a3 <BR>The b: b1 b2 </P>
<P>是不是很复杂啊，xslt2.0解决了这个难题，我们看一下2.0的程序：<BR>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<BR>&lt;xsl:stylesheet version="2.0" xmlns:xsl="<A class=contentlink href='http://www.w3.org/1999/XSL/Transform"' target=_blank>http://www.w3.org/1999/XSL/Transform"</A> xmlns:fo="<A class=contentlink href='http://www.w3.org/1999/XSL/Format"' target=_blank>http://www.w3.org/1999/XSL/Format"</A> xmlns:xs="<A class=contentlink href='http://www.w3.org/2001/XMLSchema"' target=_blank>http://www.w3.org/2001/XMLSchema"</A> xmlns:fn="<A class=contentlink href='http://www.w3.org/2005/02/xpath-functions"' target=_blank>http://www.w3.org/2005/02/xpath-functions"</A> xmlns:xdt="<A class=contentlink href='http://www.w3.org/2005/02/xpath-datatypes">' target=_blank>http://www.w3.org/2005/02/xpath-datatypes"&gt;</A><BR>&lt;xsl:output method="html"/&gt;<BR>&lt;xsl:template match="root"&gt;<BR>The a:<BR>&lt;xsl:for-each-group select="node" group-by="@a"&gt;<BR>&lt;xsl:<I>value</I>-of select="@a"/&gt;&gt;&amp;#160;<BR>&lt;/xsl:for-each-group&gt;<BR>&lt;br/&gt;<BR>The b:<BR>&lt;xsl:for-each-group select="node" group-by="@b"&gt;<BR>&lt;xsl:<I>value</I>-of select="@b"/&gt;&gt;&amp;#160;<BR>&lt;/xsl:for-each-group&gt;<BR>&lt;/xsl:template&gt;<BR>&lt;/xsl:stylesheet&gt;</P>
<P><BR>只是使用了一个语句：for-each-group 通过group-by属性就将数据进行了分组，和SQL中的group-by很像对吗？它本身还有一些属性设置，往后再一一道来。</P>
<P>这篇文章的目的告诉大家，虽然xslt2.0的内容多了，但是对于一些操作确是简化了不少:)</P>
<P><BR><BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=8&amp;ID=16265&amp;replyID=42964&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[bug tracing 的工具，不错的网站]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=4369</link>
<author>summer_smile</author>
<pubDate>2005/4/2 9:29:22</pubDate>
<description><![CDATA[<A href="http://www.metaquest.com/">http://www.metaquest.com/</A>]]></description>
</item><item>
<title><![CDATA[打算考研]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=4145</link>
<author>summer_smile</author>
<pubDate>2005/3/25 18:52:51</pubDate>
<description><![CDATA[打算考研，准备数学可能很要花点功夫，所以现在就要开始了。今天跟人家谈一个项目，如果做成，兴许能赚个两三千的。但是和那个人谈不来。决定不做，再说，不想搞.net了了，目前一段时间内。还是想学html,xml.php,mysql这些东西，比较有意思。技术多了，得有自己的认识，不然总也跟不上。]]></description>
</item><item>
<title><![CDATA[哈哈,又来了一回,]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=3684</link>
<author>summer_smile</author>
<pubDate>2005/3/14 22:20:48</pubDate>
<description><![CDATA[最近很忙]]></description>
</item><item>
<title><![CDATA[这个博格得速度还不错]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=summer_smile&amp;id=1490</link>
<author>summer_smile</author>
<pubDate>2005/1/2 16:51:08</pubDate>
<description><![CDATA[这个博格速度还不错，可以考虑用用，以前那个是在慢的要死<A><IMG src="images/emot/face42.gif">　</A>]]></description>
</item>
</channel>
</rss>