没有你的城市 的个人资料古月文武的资料库照片日志列表更多 工具 帮助

日志


1月27日

正则表达式使用详解

简介

简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。其作用如下:
测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。

基本语法

在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。
正则表达式的形式一般如下:  

/love/  其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
较为常用的元字符包括: “+”, “*”,以及 “?”。

“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次。

“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次。

“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。

下面,就让我们来看一下正则表达式元字符的具体应用。

/fo+/  因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的 “fool”, “fo”, 或者 “football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。

/eg*/  因为上述正则表达式中包含“*”元字符,表示可以与目标对象中的 “easy”, “ego”, 或者 “egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。

/Wil?/  因为上述正则表达式中包含“?”元字符,表示可以与目标对象中的 “Win”, 或者“Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。

有时候不知道要匹配多少字符。为了能适应这种不确定性,正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。

{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

{n,} n 是一个非负整数。至少匹配 n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。例如,/jim {2,6}/ 上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。
在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字符的使用方式。
代码

   1. \s:用于匹配单个空格符,包括tab键和换行符;  
   2. \S:用于匹配除单个空格符之外的所有字符;  
   3. \d:用于匹配从0到9的数字;  
   4. \w:用于匹配字母,数字或下划线字符;  
   5. \W:用于匹配所有与\w不匹配的字符;  
   6. . :用于匹配除换行符之外的所有字符。  


(说明:我们可以把\s和\S以及\w和\W看作互为逆运算)
下面,我们就通过实例看一下如何在正则表达式中使用上述元字符。
/\s+/ 上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。
/\d000/ 如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。
除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。 较为常用的定位符包括: “^”, “$”, “\b” 以及 “\B”。
代码

   1. “^”定位符规定匹配模式必须出现在目标字符串的开头 
   2. “$”定位符规定匹配模式必须出现在目标对象的结尾 
   3. “\b”定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一 
   4. “\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内, 
   5.       即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。 


同样,我们也可以把“^”和“$”以及“\b”和“\B”看作是互为逆运算的两组定位符。举例来说: /^hell/ 因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以 “hell”, “hello”或“hellhound”开头的字符串相匹配。 /ar$/ 因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以 “car”, “bar”或 “ar” 结尾的字符串相匹配。 /\bbom/ 因为上述正则表达式模式以“\b”定位符开头,所以可以与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配。/man\b/ 因为上述正则表达式模式以“\b”定位符结尾,所以可以与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。
为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如:
代码

   1. /[A-Z]/  上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。 
   2. /[a-z]/  上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。  
   3. /[0-9]/  上述正则表达式将会与从0到9范围内任何一个数字相匹配。  
   4. /([a-z][A-Z][0-9])+/ 上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。 


这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()” 把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如 “abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。
如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 “|”。例如:/to|too|2/ 上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配。
正则表达式中还有一个较为常用的运算符,即否定符 “[^]”。与我们前文所介绍的定位符 “^” 不同,否定符 “[^]”规定目标对象中不能存在模式中所规定的字符串。例如:/[^A-C]/ 上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在 “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。
最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“\”。例如:/Th\*/  上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。
在构造正则表达式之后,就可以象数学表达式一样来求值,也就是说,可以从左至右并按照一个优先级顺序来求值。优先级如下:
代码

   1. 1.\ 转义符 
   2. 2.(), (?, (?=), [] 圆括号和方括号 
   3. 3.*, +, ?, {n}, {n,}, {n,m} 限定符 
   4. 4.^, $, \anymetacharacter 位置和顺序 
   5. 5.|“或”操作 

使用实例
在JavaScript 1.2中带有一个功能强大的RegExp()对象,可以用来进行正则表达式的匹配操作。其中的test()方法可以检验目标对象中是否包含匹配模式,并相应的返回true或false。
我们可以使用JavaScript编写以下脚本,验证用户输入的邮件地址的有效性。
代码

   1. <html>  
   2. <head>  
   3.   <script language="Javascript1.2">  
   4.      <!-- start hiding  
   5.      function verifyAddress(obj)  
   6.      {  
   7.       var email = obj.email.value;  
   8.       var pattern =  
   9. /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;  
  10.       flag = pattern.test(email);  
  11.       if(flag)  
  12.       {  
  13.        alert(“Your email address is correct!”);  
  14.        return true;  
  15.       }  
  16.       else  
  17.        {  
  18.         alert(“Please try again!”);  
  19.         return false;  
  20.         }  
  21.       }  
  22.      // stop hiding -->  
  23.     </script>  
  24.   </head>  
  25.   <body>  
  26.    <form onSubmit="return verifyAddress(this);">  
  27.     <input name="email" type="text">  
  28.     <input type="submit">  
  29.     </form>  
  30.   </body>  
  31. </html>

JS的正则表达式

//校验是否全由数字组成
代码

   1. function isDigit(s) 
   2. { 
   3. var patrn=/^[0-9]{1,20}$/; 
   4. if (!patrn.exec(s)) return false 
   5. return true 
   6. } 

//校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串
代码

   1. function isRegisterUserName(s) 
   2. { 
   3. var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/; 
   4. if (!patrn.exec(s)) return false 
   5. return true 
   6. } 

//校验用户姓名:只能输入1-30个以字母开头的字串
代码

   1. function isTrueName(s) 
   2. { 
   3. var patrn=/^[a-zA-Z]{1,30}$/; 
   4. if (!patrn.exec(s)) return false 
   5. return true 
   6. } 
   7. }} 
   8.  
   9. //校验密码:只能输入6-20个字母、数字、下划线 
  10. [code] 
  11. function isPasswd(s) 
  12. { 
  13. var patrn=/^(\w){6,20}$/; 
  14. if (!patrn.exec(s)) return false 
  15. return true 
  16. } 

//校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”
代码

   1. function isTel(s) 
   2. { 
   3. //var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/; 
   4. var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; 
   5. if (!patrn.exec(s)) return false 
   6. return true 
   7. } 

//校验手机号码:必须以数字开头,除数字外,可含有“-”
代码

   1. function isMobil(s) 
   2. { 
   3. var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; 
   4. if (!patrn.exec(s)) return false 
   5. return true 
   6. } 

//校验邮政编码
代码

   1. function isPostalCode(s) 
   2. { 
   3. //var patrn=/^[a-zA-Z0-9]{3,12}$/; 
   4. var patrn=/^[a-zA-Z0-9 ]{3,12}$/; 
   5. if (!patrn.exec(s)) return false 
   6. return true 
   7. } 

//校验搜索关键字
代码

   1. function isSearch(s) 
   2. { 
   3. var patrn=/^[^`~!@#$%^&*()+=|\\\][\]\{\}:;'\,.<>/?]{1}[^`~!@$%^&()+=|\\\] 
   4.         [\]\{\}:;'\,.<>?]{0,19}$/; 
   5. if (!patrn.exec(s)) return false 
   6. return true 
   7. } 
   8.  
   9. function isIP(s) //by zergling 
  10. { 
  11. var patrn=/^[0-9.]{1,20}$/; 
  12. if (!patrn.exec(s)) return false 
  13. return true 
  14. } 

正则表达式
代码

   1. "^\\d+$"  //非负整数(正整数 + 0) 
   2. "^[0-9]*[1-9][0-9]*$"  //正整数  
   3. "^((-\\d+)|(0+))$"  //非正整数(负整数 + 0)  
   4. "^-[0-9]*[1-9][0-9]*$"  //负整数  
   5. "^-?\\d+$"    //整数  
   6. "^\\d+(\\.\\d+)?$"  //非负浮点数(正浮点数 + 0)  
   7. "^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  
   8. //正浮点数  
   9. "^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$"  //非正浮点数(负浮点数 + 0)  
  10. "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  
  11. //负浮点数  
  12. "^(-?\\d+)(\\.\\d+)?$"  //浮点数  
  13. "^[A-Za-z]+$"  //由26个英文字母组成的字符串  
  14. "^[A-Z]+$"  //由26个英文字母的大写组成的字符串  
  15. "^[a-z]+$"  //由26个英文字母的小写组成的字符串  
  16. "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串  
  17. "^\\w+$"  //由数字、26个英文字母或者下划线组成的字符串  
  18. "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"    //email地址  
  19. "^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$"  //url 
  20. "^[A-Za-z0-9_]*$"

1月24日

IT认证:特许入侵测试员——Licensed Penetration Tester(LPT)

如果你已取得了EC-Council所颁发的资讯保安专业认证,如Certified Ethical Hacker ( CEH ) 和EC-Council Certified Security Analyst ( ECSA ),便可以再下一城,取得EC-Council顾问级 ( Consultation Level ) 认证∶Licensed Penetration Tester ( 特许入侵测试员∶LPT )。
现在很多公司也注意到资讯保安的重要性,愿意花钱购买防火墙和入侵侦察系统等设备。但是有了这些基本设备,并不等於公司的资料绝对安全,有些公司更会聘用顾问公司,对公司的网络进行模拟入侵,从而发现资讯保安的漏洞,并建议补救的方法。LPT的目的就是要确定每一个获得EC-Council授权的入侵测试员专家都会严格遵守道德规则 ( code of ethics ) 和接触到现时在入侵测试方面的最佳实施方法。
怎样成为LPT?
LPT并没有考试,但是要报读EC-Council所指定的课程,并不如CEH可以自修所取得。以下是取得LPT的条件∶
1. 取得Certified Ethical Hacker ( CEH ) 认证
2. 取得EC-Council Certified Security Analyst ( ECSA ) 认证
3. 取得无犯罪纪录证明
4. 同意遵守EC-Council道德规则 ( code of ethics )
5. 在EC-Council认可的培训中心完成LPT课程
如要查询有关培训中心的位置和课程时间,可以电邮至∶haja@eccouncil.org
LPT课程内容
LPT课程一共有5日 ( 9:00 a.m.至5:00 p.m. ),分为20个单元,教授有系统性的入侵测试步骤和过程。以下是LPT的20个单元∶
1. Penetration Testing Methodologies
2. Customers and Legal Agreements
3. Penetration Testing Planning and Scheduling
4. Information Gathering
5. Vulnerability Analysis
6. External Penetration Testing
7. Internal Network Penetration Testing
8. Routers Penetration Testing
9. Firewalls Penetration Testing
10. Intrusion Detection System Penetration Testing
11. Wireless Networks Penetration Testing
12. Denial of Service Penetration Testing
13. Password Cracking Penetration Testing
14. Social Engineering Penetration Testing
15. Stolen Laptop, PDAs and Cellphones Penetration Testing
16. Application Penetration Testing
17. Physical Security Penetration Testing
18. Penetration Testing Report Analysis
19. Penetration Testing Report and Documentation Writing
20. Penetration Testing Deliverables and Conclusion
如想知道更多关於LPT的资料,请到以下网址看看∶
www.eccouncil.org/lpt/Licensed_Penetration_Tester.htm
1月23日

ASP.NET程序中常用的三十二种代码

  1. 打开新的窗口并传送参数
  传送参数:
response.write("<script>window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"’)</script>") 
  接收参数:
string a = Request.QueryString("id");
string b = Request.QueryString("id1"); 
  2.为按钮添加对话框
Button1.Attributes.Add("onclick","return confirm(’确认?’)");
button.attributes.add("onclick","if(confirm(’are you sure...?’)){return true;}else{return false;}") 
  3.删除表格选定记录
int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex];
string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString() 
  4.删除表格记录警告
private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e)
{
 switch(e.Item.ItemType)
 {
  case ListItemType.Item :
  case ListItemType.AlternatingItem :
  case ListItemType.EditItem:
   TableCell myTableCell;
   myTableCell = e.Item.Cells[14];
   LinkButton myDeleteButton ;
   myDeleteButton = (LinkButton)myTableCell.Controls[0];
   myDeleteButton.Attributes.Add("onclick","return confirm(’您是否确定要删除这条信息’);");
   break;
  default:
   break;
 }
  5.点击表格行链接另一页
private void grdCustomer_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
 //点击表格打开
 if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
  e.Item.Attributes.Add("onclick","window.open(’Default.aspx?id=" + e.Item.Cells[0].Text + "’);");
  双击表格连接到另一页
  在itemDataBind事件中
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
 string OrderItemID =e.item.cells[1].Text;
 ...
 e.item.Attributes.Add("ondblclick", "location.href=’../ShippedGrid.aspx?id=" + OrderItemID + "’");
  双击表格打开新一页
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
 string OrderItemID =e.item.cells[1].Text;
 ...
 e.item.Attributes.Add("ondblclick", "open(’../ShippedGrid.aspx?id=" + OrderItemID + "’)");
  ★特别注意:【?id=】 处不能为 【?id =】
  6.表格超连接列传递参数
<asp:HyperLinkColumn Target="_blank" headertext="ID号" DataTextField="id" NavigateUrl="aaa.aspx?id=’
 <%# DataBinder.Eval(Container.DataItem, "数据字段1")%>’ & name=’<%# DataBinder.Eval(Container.DataItem, "数据字段2")%>’ /> 
  7.表格点击改变颜色
if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)
{
 e.Item.Attributes.Add("onclick","this.style.backgroundColor=’#99cc00’;
    this.style.color=’buttontext’;this.style.cursor=’default’;");
}  
  写在DataGrid的_ItemDataBound里
if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)
{
e.Item.Attributes.Add("onmouseover","this.style.backgroundColor=’#99cc00’;
   this.style.color=’buttontext’;this.style.cursor=’default’;");
e.Item.Attributes.Add("onmouseout","this.style.backgroundColor=’’;this.style.color=’’;");

  8.关于日期格式
  日期格式设定
DataFormatString="{0:yyyy-MM-dd}" 
  我觉得应该在itembound事件中
e.items.cell["你的列"].text=DateTime.Parse(e.items.cell["你的列"].text.ToString("yyyy-MM-dd")) 
  9.获取错误信息并到指定页面
  不要使用Response.Redirect,而应该使用Server.Transfer
  e.g
// in global.asax
protected void Application_Error(Object sender, EventArgs e) {
if (Server.GetLastError() is HttpUnhandledException)
Server.Transfer("MyErrorPage.aspx");
//其余的非HttpUnhandledException异常交给ASP.NET自己处理就okay了 :)
  Redirect会导致post-back的产生从而丢失了错误信息,所以页面导向应该直接在服务器端执行,这样就可以在错误处理页面得到出错信息并进行相应的处理 
  10.清空Cookie
Cookie.Expires=[DateTime];
Response.Cookies("UserName").Expires = 0
  11.自定义异常处理
//自定义异常处理类 
using System;
using System.Diagnostics;
namespace MyAppException
{
 /// <summary>
 /// 从系统异常类ApplicationException继承的应用程序异常处理类。
 /// 自动将异常内容记录到Windows NT/2000的应用程序日志
 /// </summary>
 public class AppException:System.ApplicationException
 {
  public AppException()
  {
   if (ApplicationConfiguration.EventLogEnabled)LogEvent("出现一个未知错误。");
  }
 public AppException(string message)
 {
  LogEvent(message);
 }
 public AppException(string message,Exception innerException)
 {
  LogEvent(message);
  if (innerException != null)
  {
   LogEvent(innerException.Message);
  }
 }
 //日志记录类
 using System;
 using System.Configuration;
 using System.Diagnostics;
 using System.IO;
 using System.Text;
 using System.Threading;
 namespace MyEventLog
 {
  /// <summary>
  /// 事件日志记录类,提供事件日志记录支持 
  /// <remarks>
  /// 定义了4个日志记录方法 (error, warning, info, trace) 
  /// </remarks>
  /// </summary>
  public class ApplicationLog
  {
   /// <summary>
   /// 将错误信息记录到Win2000/NT事件日志中
   /// <param name="message">需要记录的文本信息</param>
   /// </summary>
   public static void WriteError(String message)
   {
    WriteLog(TraceLevel.Error, message);
   }
   /// <summary>
   /// 将警告信息记录到Win2000/NT事件日志中
   /// <param name="message">需要记录的文本信息</param>
   /// </summary>
   public static void WriteWarning(String message)
   {
    WriteLog(TraceLevel.Warning, message);  
   }
   /// <summary>
   /// 将提示信息记录到Win2000/NT事件日志中
   /// <param name="message">需要记录的文本信息</param>
   /// </summary>
   public static void WriteInfo(String message)
   {
    WriteLog(TraceLevel.Info, message);
   }
   /// <summary>
   /// 将跟踪信息记录到Win2000/NT事件日志中
   /// <param name="message">需要记录的文本信息</param>
   /// </summary>
   public static void WriteTrace(String message)
   {
    WriteLog(TraceLevel.Verbose, message);
   }
   /// <summary>
   /// 格式化记录到事件日志的文本信息格式
   /// <param name="ex">需要格式化的异常对象</param>
   /// <param name="catchInfo">异常信息标题字符串.</param>
   /// <retvalue>
   /// <para>格式后的异常信息字符串,包括异常内容和跟踪堆栈.</para>
   /// </retvalue>
   /// </summary>
   public static String FormatException(Exception ex, String catchInfo)
   {
    StringBuilder strBuilder = new StringBuilder();
    if (catchInfo != String.Empty)
    {
     strBuilder.Append(catchInfo).Append("\r\n");
    }
    strBuilder.Append(ex.Message).Append("\r\n").Append(ex.StackTrace);
    return strBuilder.ToString();
   }
   /// <summary>
   /// 实际事件日志写入方法
   /// <param name="level">要记录信息的级别(error,warning,info,trace).</param>
   /// <param name="messageText">要记录的文本.</param>
   /// </summary>
   private static void WriteLog(TraceLevel level, String messageText)
   {
    try
    { 
     EventLogEntryType LogEntryType;
     switch (level)
     {
      case TraceLevel.Error:
       LogEntryType = EventLogEntryType.Error;
       break;
      case TraceLevel.Warning:
       LogEntryType = EventLogEntryType.Warning;
       break;
      case TraceLevel.Info:
       LogEntryType = EventLogEntryType.Information;
       break;
      case TraceLevel.Verbose:
       LogEntryType = EventLogEntryType.SuccessAudit;
       break;
      default:
       LogEntryType = EventLogEntryType.SuccessAudit;
       break;
     }
     EventLog eventLog = new EventLog("Application", ApplicationConfiguration.EventLogMachineName, ApplicationConfiguration.EventLogSourceName );
     //写入事件日志
     eventLog.WriteEntry(messageText, LogEntryType);
    }
   catch {} //忽略任何异常
  } 
 } //class ApplicationLog
  12.Panel 横向滚动,纵向自动扩展
<asp:panel style="overflow-x:scroll;overflow-y:auto;"></asp:panel> 
  13.回车转换成Tab 
<script language="javascript" for="document" event="onkeydown">
 if(event.keyCode==13 && event.srcElement.type!=’button’ && event.srcElement.type!=’submit’ &&     event.srcElement.type!=’reset’ && event.srcElement.type!=’’&& event.srcElement.type!=’textarea’); 
   event.keyCode=9;
</script>
onkeydown="if(event.keyCode==13) event.keyCode=9" 
  14.DataGrid超级连接列
DataNavigateUrlField="字段名" DataNavigateUrlFormatString="http://xx/inc/delete.aspx?ID={0}" 
  15.DataGrid行随鼠标变色
private void DGzf_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
 if (e.Item.ItemType!=ListItemType.Header)
 {
  e.Item.Attributes.Add( "onmouseout","this.style.backgroundColor=\""+e.Item.Style["BACKGROUND-COLOR"]+"\"");
  e.Item.Attributes.Add( "onmouseover","this.style.backgroundColor=\""+ "#EFF3F7"+"\"");
 }
}
  16.模板列
<ASP:TEMPLATECOLUMN visible="False" sortexpression="demo" headertext="ID">
<ITEMTEMPLATE>
<ASP:LABEL text=’<%# DataBinder.Eval(Container.DataItem, "ArticleID")%>’ runat="server" width="80%" id="lblColumn" />
</ITEMTEMPLATE>
</ASP:TEMPLATECOLUMN>
<ASP:TEMPLATECOLUMN headertext="选中">
<HEADERSTYLE wrap="False" horizontalalign="Center"></HEADERSTYLE>
<ITEMTEMPLATE>
<ASP:CHECKBOX id="chkExport" runat="server" />
</ITEMTEMPLATE>
<EDITITEMTEMPLATE>
<ASP:CHECKBOX id="chkExportON" runat="server" enabled="true" />
</EDITITEMTEMPLATE>
</ASP:TEMPLATECOLUMN> 
  后台代码
protected void CheckAll_CheckedChanged(object sender, System.EventArgs e)
{
 //改变列的选定,实现全选或全不选。
 CheckBox chkExport ;
 if( CheckAll.Checked)
 {
  foreach(DataGridItem oDataGridItem in MyDataGrid.Items)
  {
   chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
   chkExport.Checked = true;
  }
 }
 else
 {
  foreach(DataGridItem oDataGridItem in MyDataGrid.Items)
  {
   chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
   chkExport.Checked = false;
  }
 }
  17.数字格式化
  【<%#Container.DataItem("price")%>的结果是500.0000,怎样格式化为500.00?】
<%#Container.DataItem("price","{0:¥#,##0.00}")%>
int i=123456;
string s=i.ToString("###,###.00"); 
  18.日期格式化
  【aspx页面内:<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date")%>
  显示为: 2004-8-11 19:44:28
  我只想要:2004-8-11 】
<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date","{0:yyyy-M-d}")%> 
  应该如何改?
  【格式化日期】
  取出来,一般是object((DateTime)objectFromDB).ToString("yyyy-MM-dd");
  【日期的验证表达式】
  A.以下正确的输入格式: [2004-2-29], [2004-02-29 10:29:39 pm], [2004/12/31] 
^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468][1235679])|([13579][01345789]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\s(((0?[1-9])|(1[0-2]))\:([0-5][0-9])((\s)|(\:([0-5][0-9])\s))([AM|PM|am|pm]{2,2})))?$ 
  B.以下正确的输入格式:[0001-12-31], [9999 09 30], [2002/03/03] 
^\d{4}[\-\/\s]?((((0[13578])|(1[02]))[\-\/\s]?(([0-2][0-9])|(3[01])))|(((0[469])|(11))[\-\/\s]?(([0-2][0-9])|(30)))|(02[\-\/\s]?[0-2][0-9]))$  
  【大小写转换】
HttpUtility.HtmlEncode(string);
HttpUtility.HtmlDecode(string) 
  19.如何设定全局变量
  Global.asax中
  Application_Start()事件中
  添加Application[属性名] = xxx;
  就是你的全局变量
  20.怎样作到HyperLinkColumn生成的连接后,点击连接,打开新窗口?
  HyperLinkColumn有个属性Target,将器值设置成"_blank"即可.(Target="_blank")
  【ASPNETMENU】点击菜单项弹出新窗口
  在你的menuData.xml文件的菜单项中加入URLTarget="_blank",如:
<?xml version="1.0" encoding="GB2312"?>
<MenuData ImagesBaseURL="images/"> 
<MenuGroup>
<MenuItem Label="内参信息" URL="Infomation.aspx" >
<MenuGroup ID="BBC">
<MenuItem Label="公告信息" URL="Infomation.aspx" URLTarget="_blank" LeftIcon="file.gif"/>
<MenuItem Label="编制信息简报" URL="NewInfo.aspx" LeftIcon="file.gif" />
...... 
  最好将你的aspnetmenu升级到1.2版
  21.读取DataGrid控件TextBox值
foreach(DataGrid dgi in yourDataGrid.Items)
{
 TextBox tb = (TextBox)dgi.FindControl("yourTextBoxId");
 tb.Text....
  22.在DataGrid中有3个模板列包含Textbox分别为 DG_ShuLiang (数量) DG_DanJian(单价) DG_JinE(金额)分别在5.6.7列,要求在录入数量及单价的时候自动算出金额即:数量*单价=金额还要求录入时限制为 数值型.我如何用客户端脚本实现这个功能?
  〖思归〗
<asp:TemplateColumn HeaderText="数量"> 
<ItemTemplate>
<asp:TextBox id="ShuLiang" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_ShuLiang")%>’ 
onkeyup="javascript:DoCal()"
/>
<asp:RegularExpressionValidator id="revS" runat="server" ControlToValidate="ShuLiang" ErrorMessage="must be integer" ValidationExpression="^\d+$" />
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="单价"> 
<ItemTemplate>
<asp:TextBox id="DanJian" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_DanJian")%>’ 
onkeyup="javascript:DoCal()"
/>
<asp:RegularExpressionValidator id="revS2" runat="server" ControlToValidate="DanJian" ErrorMessage="must be numeric" ValidationExpression="^\d+(\.\d*)?$" />
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="金额"> 
<ItemTemplate>
<asp:TextBox id="JinE" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_JinE")%>’ />
</ItemTemplate>
</asp:TemplateColumn><script language="javascript">
function DoCal()
{
 var e = event.srcElement;
 var row = e.parentNode.parentNode;
 var txts = row.all.tags("INPUT");
 if (!txts.length || txts.length < 3)
  return;
 var q = txts[txts.length-3].value;
 var p = txts[txts.length-2].value;
 if (isNaN(q) || isNaN(p))
  return;
 q = parseInt(q);
 p = parseFloat(p);
 txts[txts.length-1].value = (q * p).toFixed(2);
}
</script> 
  23.datagrid选定比较底下的行时,为什么总是刷新一下,然后就滚动到了最上面,刚才选定的行因屏幕的关系就看不到了。
page_load 
page.smartNavigation=true 
  24.在Datagrid中修改数据,当点击编辑键时,数据出现在文本框中,怎么控制文本框的大小? 
private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e)
{
 for(int i=0;i<e.Item.Cells.Count-1;i++)
  if(e.Item.ItemType==ListItemType.EditType)
  {
   e.Item.Cells[i].Attributes.Add("Width", "80px")
  } 
  25.对话框
private static string ScriptBegin = "<script language=\"JavaScript\">";
private static string ScriptEnd = "</script>";
public static void ConfirmMessageBox(string PageTarget,string Content)
{
 string ConfirmContent="var retValue=window.confirm(’"+Content+"’);"+"if(retValue){window.location=’"+PageTarget+"’;}";
 ConfirmContent=ScriptBegin + ConfirmContent + ScriptEnd;
 Page ParameterPage = (Page)System.Web.HttpContext.Current.Handler;
 ParameterPage.RegisterStartupScript("confirm",ConfirmContent);
 //Response.Write(strScript);
  26. 将时间格式化:string aa=DateTime.Now.ToString("yyyy年MM月dd日"); 
  1.1 取当前年月日时分秒 
currentTime=System.DateTime.Now; 
  1.2 取当前年 
int 年= DateTime.Now.Year; 
  1.3 取当前月 
int 月= DateTime.Now.Month;  
  1.4 取当前日 
int 日= DateTime.Now.Day;  
  1.5 取当前时 
int 时= DateTime.Now.Hour;  
  1.6 取当前分 
int 分= DateTime.Now.Minute;  
  1.7 取当前秒 
int 秒= DateTime.Now.Second;  
  1.8 取当前毫秒 
int 毫秒= DateTime.Now.Millisecond;
  27.自定义分页代码
  先定义变量 :
public static int pageCount; //总页面数 
public static int curPageIndex=1; //当前页面  
  下一页: 
if(DataGrid1.CurrentPageIndex < (DataGrid1.PageCount - 1)) 

 DataGrid1.CurrentPageIndex += 1; 
 curPageIndex+=1; 
bind(); // DataGrid1数据绑定函数  
  上一页: 
if(DataGrid1.CurrentPageIndex >0) 

 DataGrid1.CurrentPageIndex += 1; 
 curPageIndex-=1; 
bind(); // DataGrid1数据绑定函数  
  直接页面跳转: 
int a=int.Parse(JumpPage.Value.Trim());//JumpPage.Value.Trim()为跳转值 
if(a<DataGrid1.PageCount) 

 this.DataGrid1.CurrentPageIndex=a; 
bind();  
  28.DataGrid使用
  添加删除确认: 
private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) 

 foreach(DataGridItem di in this.DataGrid1.Items) 
 { 
  if(di.ItemType==ListItemType.Item||di.ItemType==ListItemType.AlternatingItem) 
  { 
   ((LinkButton)di.Cells[8].Controls[0]).Attributes.Add("onclick","return confirm(’确认删除此项吗?’);"); 
  } 
 } 
}  
  样式交替: 
ListItemType itemType = e.Item.ItemType; 
if (itemType == ListItemType.Item ) 

 e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor=’#FFFFFF’;"; 
 e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor=’#d9ece1’;cursor=’hand’;" ; 

else if( itemType == ListItemType.AlternatingItem) 

 e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor=’#a0d7c4’;"; 
 e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor=’#d9ece1’;cursor=’hand’;" ; 
}  
  添加一个编号列: 
DataTable dt= c.ExecuteRtnTableForAccess(sqltxt); //执行sql返回的DataTable 
DataColumn dc=dt.Columns.Add("number",System.Type.GetType("System.String")); 
for(int i=0;i<dt.Rows.Count;i++) 

 dt.Rows[i]["number"]=(i+1).ToString(); 
DataGrid1.DataSource=dt; 
DataGrid1.DataBind();  
  DataGrid1中添加一个CheckBox,页面中添加一个全选框 
private void CheckBox2_CheckedChanged(object sender, System.EventArgs e) 

 foreach(DataGridItem thisitem in DataGrid1.Items) 
 { 
  ((CheckBox)thisitem.Cells[0].Controls[1]).Checked=CheckBox2.Checked; 
 } 
}  
  将当前页面中DataGrid1显示的数据全部删除 
foreach(DataGridItem thisitem in DataGrid1.Items) 

 if(((CheckBox)thisitem.Cells[0].Controls[1]).Checked) 
 { 
  string strloginid= DataGrid1.DataKeys[thisitem.ItemIndex].ToString(); 
  Del (strloginid); //删除函数 
 } 
}  
  29.当文件在不同目录下,需要获取数据库连接字符串(如果连接字符串放在Web.config,然后在Global.asax中初始化) 
  在Application_Start中添加以下代码: 
Application["ConnStr"]=this.Context.Request.PhysicalApplicationPath+ConfigurationSettings.
   AppSettings["ConnStr"].ToString(); 
  30.变量ToString() 
  字符型转换 转为字符串 
12345.ToString("n"); //生成 12,345.00 
12345.ToString("C"); //生成 ¥12,345.00 
12345.ToString("e"); //生成 1.234500e+004 
12345.ToString("f4"); //生成 12345.0000 
12345.ToString("x"); //生成 3039 (16进制) 
12345.ToString("p"); //生成 1,234,500.00%  
  31.变量Substring(参数1,参数2)
  截取字串的一部分,参数1为左起始位数,参数2为截取几位。 如:string s1 = str.Substring(0,2); 
  32.在自己的网站上登陆其他网站(如果你的页面是通过嵌套方式的话,因为一个页面只能有一个FORM,这时可以导向另外一个页面再提交登陆信息) 
<SCRIPT language="javascript"> 
<!-- 
 function gook(pws) 
 { 
  frm.submit(); 
 } 
//--> 
</SCRIPT> <body leftMargin="0" topMargin="0" onload="javascript:gook()" marginwidth="0" marginheight="0"> 
<form name="frm" action=" http://220.194.55.68:6080/login.php?retid=7259 " method="post"> 
<tr> 
<td>
<input id="f_user" type="hidden" size="1" name="f_user" runat="server">
<input id="f_domain" type="hidden" size="1" name="f_domain" runat="server">
<input class="box" id="f_pass" type="hidden" size="1" name="pwshow" runat="server"> 
<INPUT id="lng" type="hidden" maxLength="20" size="1" value="5" name="lng">
<INPUT id="tem" type="hidden" size="1" value="2" name="tem"> 
</td> 
</tr> 
</form>  
  文本框的名称必须是你要登陆的网页上的名称,如果源码不行可以用vsniffer 看看。 
  下面是获取用户输入的登陆信息的代码: 
string name; 
name=Request.QueryString["EmailName"]; 
try 

 int a=name.IndexOf("@",0,name.Length); 
 f_user.Value=name.Substring(0,a); 
 f_domain.Value=name.Substring(a+1,name.Length-(a+1)); 
 f_pass.Value=Request.QueryString["Psw"]; 
catch 

 Script.Alert("错误的邮箱!"); 
 Server.Transfer("index.aspx"); 
}
1月18日

C#与RSS亲密接触

现讲述动态生成RSS文件的方法。
动态生成RSS文件也基本有两种方法,一种是用字符串累加的方法,另一种是使用xml文档生成的方法。字符串累加的方法也比较简单,我也就不多说了,这里着重说一下生成XmlDocument的方法,包括各种节点的创建,属性的创建等。当然在此也有必要说明一下为什么采用后者,因为后者符合XML DOM标准,有利于你认识dom模型,并且构造速度更快,构造出的xml文档更不容易出错,其中有一些细节我也会做一些必要的讲述。
 
主方法如下:
private void WriteRSS()
{
     XmlDocument domDoc = new XmlDocument();
     XmlDeclaration nodeDeclar = domDoc.CreateXmlDeclaration("1.0", System.Text.Encoding.UTF8.BodyName, "yes");
     domDoc.AppendChild(nodeDeclar);
 
     //如果rss有样式表文件的话,加上这两句
     XmlProcessingInstruction nodeStylesheet = domDoc.CreateProcessingInstruction("xml-stylesheet","type=\"text/css\" href=\"rss.css\"");
     domDoc.AppendChild(nodeStylesheet);
 
     XmlElement root = domDoc.CreateElement("rss");
     root.SetAttribute("version","2.0"); //添加属性结点
     domDoc.AppendChild(root);
 
     XmlElement chnode = domDoc.CreateElement("channel");
     root.AppendChild(chnode);
 
     XmlElement element = domDoc.CreateElement("title");
     XmlNode textNode = domDoc.CreateTextNode("城市内心黑幕");    //文本结点
     element.AppendChild(textNode);
     chnode.AppendChild(element);
 
     element = domDoc.CreateElement("link");
     textNode = domDoc.CreateTextNode(http://chinahubin.spaces.live.com);
     element.AppendChild(textNode);
     chnode.AppendChild(element);
 
     element = domDoc.CreateElement("description"); //引用结点
     XmlNode cDataNode = domDoc.CreateCDataSection("城市内心黑幕");
     element.AppendChild(cDataNode);
     chnode.AppendChild(element);
 
     DataTable dt = GetDataTab();     //访问数据库,获取要在rss中显示的记录
 
     foreach(DataRow dr in dt.Rows)
     {
         element = domDoc.CreateElement("item");
 
         //...
         //创建内容结点,常见的如title,description,link,pubDate,创建方法同上
         //...
 
         chnode.AppendChild(element);
     }
 
     //输出
     XmlTextWriter objTextWrite = new XmlTextWriter(this.Response.OutputStream,System.Text.Encoding.UTF8);
     domDoc.WriteTo(objTextWrite);
     objTextWrite.Flush();
     objTextWrite.Close();
}
 
输出结果如下(item部分是为说明实例手工添加):
<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
<channel>
<title>没有你的城市——誓言的毁灭</title>
<link>http://chinahubin.spaces.live.com</link>
<description>
<![CDATA]城市内心黑幕>
 </description>
<item id="">
        <title></title>
           <link></link>
           <pubDate>2006-10-15 21:59:36</pubDate>
 </item>
<item id="">
          <title></title>
           <link></link>
<pubDate>2006-10-15 10:33:53</pubDate>
</item>
 <title>[中介][出售住宅]明发国际新城32293万元/</title>
 <link>http://www.ewhouse.com/HouseInfo.aspx?publishId=3440</link>
 <pubDate>2006-10-12 10:50:18</pubDate>
 </item>
</channel>
</rss>
 
 
有几点值得说明的有:
1、 CreateTextNode,即创建文本结点
有人习惯使用InnerText来添加结点中的文本,虽然结果是一样的,但是要知道在DOM中文本也是结点,既然要符合DOM标准,就要进行到底!
2、 输出
我在实例中使用XmlTextWriter输出。
实际还可以使用如下:
Response.ContentType = "application/xml"; // 输出并按xml数据显示
Response.Write(domDoc.InnerXml);
但是,使用XmlTextWriter输出更快,所以也建议使用这个方法。

用XMLTextWriter方法实现如下:

XmlTextWriter writer = new XmlTextWriter(this.Response.OutputStream,System.Text.Encoding.UTF8);
writer.Formatting = Formatting.Indented;
writer.Indentation = 3;

writer.WriteStartDocument();

writer.WriteComment("Create using XmlTextWriter at " + DateTime.Now);

writer.WriteStartElement("rss");
writer.WriteAttributeString("version","2.0");

writer.WriteStartElement("channel");
writer.WriteElementString("title","没有你的城市——誓言的毁灭");
writer.WriteElementString("link",http://chinahubin.spaces.live.com);
writer.WriteCData("揭露城市内心黑幕");

//
//中间添加访问数据库部分……
//
writer.WriteEndElement();
writer.WriteEndElement();

writer.Flush();
writer.Close();

这个方法是把xml文件输出 ,如果要保存为xml文件,第一句用这样:
XmlTextWriter writer = new XmlTextWriter(Server.MapPath("grade.xml",null);

1月15日

HTML中相对URL的选取

HTML中的相对URL绝对是个艺术,其变化多端简直几近于C语言的缓冲区溢出。下面谈一下偶在调试中遇到的几个相对URL的问题。
1、真正的相对路径
据个例子,假如你有一个调试用的服务器地址为"http://localhost"。其下还有几个子功能。包括"http://localhost/hello"和"http://localhost/hello/test"。这时就可以考虑使用相对路径了。假如在/hello页面中要链接到/hello/test页面去。可以在链接标签中使用href="test"就可以正确的链接过去。因为在/hello页的当前URL是/hello,所以对于test的链接就转换为/hello/test。
2、全局相对路径
其实这一段的所谓相对路径,仅仅是指不含有主机名的路径而已。主要特征就是在相对URL的最前面是含有"/"的。这样的路径就是以URL的跟路径开始计算的。比如有一个页面/hello/test2,需要链接到/hello/test。按照方法一的写法应该是<a href="../test">,虽然还是看的懂,但总不是那么简洁。所以可以考虑使用全局相对路径。如下<a href="/hello/test">,这样是以URL的根路径开始寻找的,可以很好的找到需要的路径。
全局相对路径是一种很好的方式,可以实现在一个WEB应用的部署内部很好的链接,也不需要为了".."而晕倒。问题就是,如果一个应用的部署从"/"变成了"/app"之类的,就会出问题了。而这种情况在Tomcat等等不太适合在根路径上配置服务的服务器就比较常见了。
3、框架中的相对URL
框架中的相对URL就比较容易理解了。比如在一个框架中制定另一个框架页面需要打开的相对URL,这时这个相对URL就是基于本框架页面的。比如左侧框架页面正在显示的页面是/hello/test.html,而右侧框架页面正在显示/hi/test.html。则在左侧框架页面的一个连接<a href="test2.html" target=XXX>在右侧框架页面打开连接的话,则是打开/hello/test2.html。
4、框架中的JavaScript的相对
这个就比较恶心了,在左侧框架页面中的一个连接上使用事件来处理JS代码。JS代码中直接引用右侧框架页面对象,并指定相对URL,则这时的相对URL是基于原来的目的框架页面的。在这种情况中是很容易与第3条相混淆的,应该注意。