1. 对象问题
1.1 Form对象
现有问题:
现有代码这获得form对象通过document.forms("formName"),这样使用在IE 能接受,MF 不能。
解决方法:
改用 作为下标运算。改为document.forms["formName"]
备注
上述的改用 作为下标运算中的formName是id而name

1.2 HTML对象
现有问题:
在 IE 中,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能。
document.all("itemName")或者document.all("itemId")
解决方法:
使用对象ID作为对象变量名
document.getElementById("itemId")
备注
document.all是IE自定义的方法,所以请大家尽量不使用。
还有一种方式,在IE和MF都可以使用
var f = document.forms["formName "];
var o = f. itemId;

1.3 DIV对象
现有问题:
在 IE 中,DIV对象可以使用ID作为对象变量名直接使用。在 MF 中不能。
DivId.style.display = "none"
解决方法:
document.getElementById("DivId").style.display = "none"
备注
获得对象的方法不管是不是DIV对象,都使用getElementById方法。参见1.2


1.4 关于frame
现有问题
在 IE中 可以用window.testFrame取得该frame,mf中不行
解决方法
在frame的使用方面MF和IE的最主要的区别是:
如果在frame标签中书写了以下属性:

那么IE可以通过id或者name访问这个frame对应的window对象
而mf只可以通过name来访问这个frame对应的window对象
例如如果上述frame标签写在最上层的window里面的htm里面,那么可以这样访问
IE: window.top.frameId或者window.top.frameName来访问这个window对象
MF:只能这样window.top.frameName来访问这个window对象
另外,在mf和ie中都可以使用window.top.document.getElementById("frameId")来访问frame标签
并且可以通过window.top.document.getElementById("testFrame").src = 'xx.htm'来切换frame的内容
也都可以通过window.top.frameName.location = 'xx.htm'来切换frame的内容

1.5 窗口
现有问题
IE中可以通过showModalDialog和showModelessDialog打开模态和非模态窗口,但是MF不支持。
解决办法
直接使用window.open(pageURL,name,parameters)方式打开新窗口。
如果需要传递参数,可以使用frame或者iframe。

2. 总结
2.1 在JS中定义各种对象变量名时,尽量使用id,避免使用name。
在 IE 中,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能,所以在平常使用时请尽量使用id,避免只使用name,而不使用id。

2.2 变量名与某 HTML 对象 id 相同的问题
现有问题
在 MF 中,因为对象 id 不作为 HTML 对象的名称,所以可以使用与 HTML 对象 id 相同的变量名,IE 中不能。
解决方法
在声明变量时,一律加上 var ,以避免歧义,这样在 IE 中亦可正常运行。
此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。


1. document.all
Firefox可以兼容document.all, 但会生成一条警告。可以用getElementById("*") 或者 getElementByTagName("*)来代替
不过对于document.all.length等属性,则完全不兼容。
2. parentElement
这个也不兼容。比方说, obj.parentElement.name 则应改成 obj.parentNode.attributes.getNamedItem("name").nodeValue (不知道如何写得更简洁些)
3. event
W3C不支持windows.event
比方说:
在IE里面


.....

function onMenuClick()
{
collapseMenu(event.srcElement);
}
工作正常。不过在Firefox中,则改成:

 

function onMenuClick(evt)
{
if(evt == null)
evt = window.event; // For IE
var srcElement = evt.srcElement? evt.srcElement : evt.target; // IE使用srcElement, 而Firefox使用target
collapseMenu(srcElement);
}


IE和FIREFOX在解析CSS方面的区别
对高度的解析
IE:将根据内容的高度变化,包括未定义高度的图片内容,即使定义了高度,当内容超过高度时,将使用实际高度

Firefox:没有定义高度时,如果内容中包括了图片内容,MF的高度解析是根据印刷标准,这样就会造成和实际内容高度不符合的情况;当定义了高度,但是内容超过高度时,内容会超出定义的高度,但是区域使用的样式不会变化,造成样式错位。

结论:大家在可以确定内容高度的情况下最好定义高度,如果真的没有办法定义高度,最好不用使用边框样式,否则样式肯定会出现混乱!

img对象alt和title的解析
alt:当照片不存在或者load错误时的提示;

title:照片的tip说明。

在IE中如果没有定义title,alt也可以作为img的tip使用,但是在MF中,两者完全按照标准中的定义使用

结论:大家在定义img对象时,最后将alt和title对象都写全,保证在各种浏览器中都能正常使用

其他的细节差别

当你在写css的时候,特别是用float: left(或right)排列一窜图片时,会发现在firefox里面正常而IE里面有问题。无论你用margin:0,还是border: 0来约束,都无济于事。

其实这里还有另外一个问题,就是IE对于空格的处理,firefox是忽略的而IE对于块与块之间的空格是处理的。也就是说一个div结束后要紧接着一个div写,中间不要有回车或者空格。不然也许会有问题,比如3px的偏差,而且这个原因很难发现。

非常不走运的是我又碰到了这样的问题,多个img标签连着,然后定义的float: left,希望这些图片可以连起来。但是结果在firefox里面正常而IE里面显示的每个img都相隔了3px。我把标签之间的空格都删除都没有作用。

后来的解决方法是在img外面套li,并且对li定义margin: 0,这样就解决了IE和firefox的显示偏差。IE对于一些模型的解释会产生很多错误问题,只有多多尝试才能发现原因。

这只是一些简单的区别,在做布局和CSS设计时候可以综合考虑,但最为有效与简单的解决兼容问题还是用TABLE表格,表格在兼容性方面有着不错的表现.

另外在模版的JS设计的时候也需要考虑两者对代码的兼容,以下是对IE与FIREFOX中JS的一些测试:

以下以 IE 代替 Internet Explorer,以 MF 代替 Mozilla Firefox

1. document.form.item 问题
(1)现有问题:
现有代码中存在许多 document.formName.item("itemName") 这样的语句,不能
在 MF 下运行
(2)解决方法:
改用 document.formName.elements["elementName"]
(3)其它
参见 2

2. 集合类对象问题
(1)现有问题:
现有代码中许多集合类对象取用时使用 (),IE 能接受,MF 不能。
(2)解决方法:
改用 [] 作为下标运算。如:document.forms("formName") 改为
document.forms["formName"]。
又如:document.getElementsByName("inputName")(1) 改为
document.getElementsByName("inputName")[1]
(3)其它

3. window.event
(1)现有问题:
使用 window.event 无法在 MF 上运行
(2)解决方法:
MF 的 event 只能在事件发生的现场使用,此问题暂无法解决。可以这样变通:
原代码(可在IE中运行):

onclick="javascript:gotoSubmit()"/>
...
<script language="javascript">
function gotoSubmit() {
...
alert(window.event); // use window.event
...
}
</script>

新代码(可在IE和MF中运行):

onclick="javascript:gotoSubmit(event)"/>
...
<script language="javascript">
function gotoSubmit(evt) {
evt = evt ? evt : (window.event ? window.event : null);
...
alert(evt); // use evt
...
}
</script>
此外,如果新代码中第一行不改,与老代码一样的话(即 gotoSubmit 调用没有给
参数),则仍然只能在IE中运行,但不会出错。所以,这种方案 tpl 部分仍与老
代码兼容。

///////////////////////////////////////////////////////////////////////
// 以下来自网友 llihua
//事件处理函数
function a(evt) { //FireFox
evt = evt? evt: window.event; //IE
var srcElem = (evt.target)? evt.target: evt.srcElement;
//事件处理...
}

在连接事件处理函数的时候,可以用Inline HTML方式,也可以用Event
property方式定义。

1、使用Inline HTML方式,如:

onclick="javascript:a(event)">

注意:
(1)javascript不能省;
(2)实参要使用event,形参使用什么都可以(如evt、event等);

2、使用Event property方式绑定事件处理函数,如:
document.form2.radio[0].onclick = a;
// 以上来自网友 llihua
///////////////////////////////////////////////////////////////////////

4. HTML 对象的 id 作为对象名的问题
(1)现有问题
在 IE 中,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在
MF 中不能。
(2)解决方法
用 getElementById("idName") 代替 idName 作为对象变量使用。

5. 用idName字符串取得对象的问题
(1)现有问题
在IE中,利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象,在MF 中不
能。
(2)解决方法
用 getElementById(idName) 代替 eval(idName)。

6. 变量名与某 HTML 对象 id 相同的问题
(1)现有问题
在 MF 中,因为对象 id 不作为 HTML 对象的名称,所以可以使用与 HTML 对象
id 相同的变量名,IE 中不能。
(2)解决方法
在声明变量时,一律加上 var ,以避免歧义,这样在 IE 中亦可正常运行。
此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。
(3)其它
参见 问题4

7. event.x 与 event.y 问题
(1)现有问题
在IE 中,event 对象有 x, y 属性,MF中没有。
(2)解决方法
在MF中,与event.x 等效的是 event.pageX。但event.pageX IE中没有。
故采用 event.clientX 代替 event.x。在IE 中也有这个变量。
event.clientX 与 event.pageX 有微妙的差别(当整个页面有滚动条的时候),
不过大多数时候是等效的。

如果要完全一样,可以稍麻烦些:
mX = event.x ? event.x : event.pageX;
然后用 mX 代替 event.x
(3)其它
event.layerX 在 IE 与 MF 中都有,具体意义有无差别尚未试验。


8. 关于frame
(1)现有问题
在 IE中 可以用window.testFrame取得该frame,mf中不行
(2)解决方法
在frame的使用方面mf和ie的最主要的区别是:
如果在frame标签中书写了以下属性:
<frame src="xx.htm" id="frameId" name="frameName" />
那么ie可以通过id或者name访问这个frame对应的window对象
而mf只可以通过name来访问这个frame对应的window对象
例如如果上述frame标签写在最上层的window里面的htm里面,那么可以这样访问
ie: window.top.frameId或者window.top.frameName来访问这个window对象
mf: 只能这样window.top.frameName来访问这个window对象

另外,在mf和ie中都可以使用
window.top.document.getElementById("frameId")
来访问
frame标签
并且可以通过
window.top.document.getElementById("testFrame").src = 'xx.htm'
来切换frame的内容
也都可以通过window.top.frameName.location = 'xx.htm'来切换frame的内容
关于frame和window的描述可以参见bbs的‘window与frame’文章
以及/test/js/test_frame/目录下面的测试
----adun 2004.12.09修改

9. 在mf中,自己定义的属性必须getAttribute()取得
10.在mf中没有 parentElement parement.children 而用
parentNode parentNode.childNodes
childNodes的下标的含义在IE和MF中不同,MF使用DOM规范,childNodes中会插入空白
文本节点。
一般可以通过node.getElementsByTagName()来回避这个问题。
当html中节点缺失时,IE和MF对parentNode的解释不同,例如

 


 


MF中input.parentNode的值为form, 而IE中input.parentNode的值为空节点

MF中节点没有removeNode方法,必须使用如下方法
node.parentNode.removeChild(node)

11.const 问题
(1)现有问题:
在 IE 中不能使用 const 关键字。如 const constVar = 32;
在IE中这是语法错误。
(2)解决方法:
不使用 const ,以 var 代替。

12. body 对象
MF的body在body标签没有被浏览器完全读入之前就存在,而IE则必须在body完全被读入
之后才存在

13. url encoding
在js中如果书写url就直接写&不要写&例如
var url = 'xx.jsp?objectName=xx&objectEvent=xxx';
frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器
一般会服务器报错参数没有找到
当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&
一般MF无法识别js中的&


14. nodeName 和 tagName 问题
(1)现有问题:
在MF中,所有节点均有 nodeName 值,但 textNode 没有 tagName 值。在 IE 中,
nodeName 的使用好象
有问题(具体情况没有测试,但我的IE已经死了好几次)。
(2)解决方法:
使用 tagName,但应检测其是否为空。

15. 元素属性
IE下 input.type属性为只读,但是MF下可以修改


16. document.getElementsByName() 和 document.all[name] 的问题
(1)现有问题:
在 IE 中,getElementsByName()、document.all[name] 均不能用来取得 div 元素
(是否还有其它不能取的元素还不知道)。

posted @ 2008-08-14 11:32 hcmfys_lover 阅读(14) | 评论 (0)编辑
一、操作系统
window系统内部都是unicode的。文件夹名,文件名等都是unicode的,任何语言系统下都能正常显示。
二、输入法:
微软拼音输出的是Unicode的,智能ABC输出是简体中文的(所以智能ABC在非简体中文系统根本不能用,只能打英文)。
三、网页的textarea
网页的textarea是用unicode显示的。所以往里打什么字都能显示。而一些flash做的输入框就不行了。
四、Access2000
access里面保存的数据是unicode的,在任何语言系统下都能显示。
如果数据视图查看有些字符不正常,那是因为显示所用的字体不是Unicode字体,
换用Arial Unicode MS 字体就能全部显示了。(access帮助,搜索,输入unicode,有说明)
五、Word
word里的繁简转换,简体转换到繁体后,内码仍是简体中文的,其实只是简体中的繁体字。
六、ASP内部是Unicode的,所有文本都是Unicode存储的。需要时转换到指定字符集。
=======================================================
首先说下结论:
<%@ codepage=936%>简体中文
<%@ codepage=950%>繁体中文
<%@ codepage=65001%>UTF-8

codepage指定了IIS按什么编码读取传递过来的串串(表单提交,地址栏传递等)。
也指定了所有文本变量从Unicode转换到的编码,
也就指定了从数据库取出的数据从Unicode转换到的编码。(注意这个,很重要。)

关键字:
读取:一个串串,按简体读取是一些字,按繁体读取是一些字,串串本身编码没有变。
转换:系统主动的转换,比如从Unicode的“化”字到Big5的“化”字,内码变成Big5的。如果Big5没有对应的字,保留Unicode形式(&#xxxx;)

简体中文:化六个结论
Unicode16进制形式:化六个结论
Unicode10进制形式:化六个结论

下面是我推测出来的编码转换的过程:
客户端:输入法Unicode--输入框unicode--从Unicode按charset转换到对应编码()--表单发送编码

服务器端:IIS解开表单编码--按codepage指定编码读取--转换到对应的Unicode--可以用request("")读取了--进行一些处理--以Unicode编码保存到数据库

服务器端:读取数据库的Unicode数据,转换到codepage指定编码---生成源代码--IE按charset读取显示。


 
posted @ 2008-08-14 11:11 hcmfys_lover 阅读(17) | 评论 (0)编辑
天在做JMAIL发邮件的时候,接收到的邮件标题全是乱码,经在BAIDU上搜索终于解决了,以下是函数代码..

jmail.silent = true '屏蔽例外错误,返回FALSE跟TRUE两值j
jmail.logging = true '启用邮件日志
jmail.Charset = "GB2312" '邮件的文字编码为国标
jmail.ContentType = "text/html" '邮件的格式为HTML格式


jmail.ISOEncodeHeaders = false '是否进行ISO编码,默认为True(加上了这一句)
jmail.AddRecipient email '邮件收件人的地址
jmail.From = "163@163.com" '发件人的E-MAIL地址
jmail.MailServerUserName = "u" '登录邮件服务器所需的用户名
jmail.MailServerPassword = "p" '登录邮件服务器所需的密码

jmail.Subject = title '邮件的标题
jmail.Body = content '邮件的内容
'jmail.Prority = 1 '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值
jmail.Send("Smtp.163.com") '执行邮件发送(通过邮件服务器地址)
jmail.Close() '关闭对象
posted @ 2008-07-18 12:18 hcmfys_lover 阅读(25) | 评论 (1)编辑
1、sql注入比较难防,需要替换select,delete等一打字符
其实对于字符型替换再多都没有替换单引号为两个单引号来的好!对于数字型替换再多都没有用,一定要类型转换。
2、忽略DropDownList传来的东西
其实是不对的,一切客户端的东西都是不可信任的,select下拉框也是!因为可以自己做一个htm提交到服务器。
3、access比sqlserver不安全
安全不安全关键看怎么用,如果sqlserver还是像access一样用,一个sa帐户的话,很明显,sqlserver比access不安全,可以直接得到表名和字段名!access反而倒安全点了,因为只能通过逐位猜解得到。
4、网站没有显示出错信息就说明网站是安全的
当有记录的时候显示记录,没有记录的时候显示找不到任何记录,通过这两种状态就可以猜解字段名了,所以网页不出错不能说明是安全的
5、忽略post提交的信息
很多人对url上传递的东西过滤严格,对于post的东西不理不睬是不对的,post的东西更加容易被注入,因为一般字段比较多

在asp.net中强烈建议通过参数来实现sql而不是sql拼接,因为就算你每一个都过滤百密难有疏
比如:

SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
            SqlCommand comm=new SqlCommand("update tb1 set vName=@vName,iAge=@iAge where ID=@id",conn);
            SqlParameter parm1=new SqlParameter("@vName",SqlDbType.NVarChar,50);
            parm1.Value=((TextBox)e.Item.FindControl("name")).Text;
            SqlParameter parm2=new SqlParameter("@iAge",SqlDbType.Int);
            parm2.Value=((TextBox)e.Item.FindControl("age")).Text;
            SqlParameter parm3=new SqlParameter("@id",SqlDbType.Int);
            parm3.Value=this.DataGrid1.DataKeys[e.Item.ItemIndex];
            comm.Parameters.Add(parm1);
            comm.Parameters.Add(parm2);
            comm.Parameters.Add(parm3);
            conn.Open();
            comm.ExecuteNonQuery();
            conn.Close();


这样的代码看起来舒服而且又安全,何乐不为?

posted @ 2008-07-11 15:22 hcmfys_lover 阅读(27) | 评论 (0)编辑
scrollHeight: 获取对象的滚动高度。
scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离
scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离
scrollWidth:获取对象的滚动宽度
offsetHeight:获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度
offsetLeft:获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置
offsetTop:获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置
event.clientX 相对文档的水平座标
event.clientY 相对文档的垂直座标
event.offsetX 相对容器的水平坐标
event.offsetY 相对容器的垂直坐标
document.documentElement.scrollTop 垂直方向滚动的值
event.clientX+document.documentElement.scrollTop 相对文档的水平座标+垂直方向滚动的量

以上主要指IE之中,FireFox差异如下:
IE6.0、FF1.06+:
clientWidth = width + padding
clientHeight = height + padding
offsetWidth = width + padding + border
offsetHeight = height + padding + border
IE5.0/5.5:
clientWidth = width - border
clientHeight = height - border
offsetWidth = width
offsetHeight = height
(需要提一下:CSS中的margin属性,与clientWidth、offsetWidth、clientHeight、offsetHeight均无关)

 
 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title> Slider Show Demo - http://www.never-online.net </title>
    <meta http-equiv="ImageToolbar" content="no" />
    <style type="text/css" media="all" title="Default">
      * {
        font-family: Trebuchet MS, Lucida Sans Unicode, Arial, sans-serif;
        margin:0;
      }
      body {
        font-size:10pt;
        text-align:center;
      }
      .sliderShowBox {
        border:1px solid #333;
        visibility:hidden;
        position:absolute;
        background-color:#eee;
        overflow:hidden;
        width:250px;
        text-align:left;
      }
      .sliderShowContent {
        padding:5px;
      }
    </style>
    <script type="text/javascript">
    //<![CDATA[

      var sliderActive = false;//是否是在动画的过程中
      var sliderTimer = null;

      function effect_sliderShow (sliderActId, sliderBoxId)
   {

        if (sliderActive) return;
    sliderActive = true;
    //javascript:effect_sliderShow(this,'sliderShowBox')
        var sliderAct = $(sliderActId);//得到点击的元素,以便得到坐标作动画
        var sliderBox = $(sliderBoxId);//得到tip的容器

        var sliderHeight = parseInt(sliderBox.style.height)||sliderBox.offsetHeight;
        //因为我们使tip的容器不可见用的是css里的visible,
        //所以可以得到容器的高度,如果用display为none,则是得不到元素的高度的。但可以自定义容器的高度
        var visibility = sliderBox.style.visibility;//容器是否可见
        var sliderSpeed = 10;
        //动画的速度,值越小,则越快,
        //说明一点,其实用到10已经将近是极限了,
        //你可以将这个值改为0,事实上与10相差无几。为何如此?先做一个悬念吧,也做为一个思考:D

        if (visibility=="visible")
    {
          //如果容器当前是可见的,这里就执行关闭动画
          sliderBox.style.visibility="visible";//将容器设为可见
          sliderBox.style.top = sliderAct.offsetTop+sliderAct.offsetHeight+"px";//容器的Y坐标=相对元素的Y坐标+相对元素的高度
          sliderBox.style.left = sliderAct.offsetLeft+"px";//容器X坐标与相对元素的X坐标相同
          sliderBox.style.height = sliderHeight+"px";//动画初始高度为TIP容器的原始高度
          animateClose();
        }
    else
    {
          sliderBox.style.visibility="visible";//将容器设为可见
          sliderBox.style.top = sliderAct.offsetTop+sliderAct.offsetHeight+"px";//容器的Y坐标=相对元素的Y坐标+相对元素
          sliderBox.style.left = sliderAct.offsetLeft+"px";//容器X坐标与相对元素的X坐标相同
          sliderBox.style.height = "1px";//动画初始高度为1像素
          animateShow();
        }

        function animateShow()
    {
          var h = parseInt(sliderBox.style.height)||0;//得到容器的高度
          if (h >= sliderHeight)
     {
      //如果高度>原始高度,则清除timeout,并返回
            sliderBox.style.height = sliderHeight+'px';//将容器高度复原
            window.clearTimeout(sliderTimer);
            return sliderActive=false;
          }
          //容器高度+1并递归此显示函数
          sliderBox.style.height = h+1 +"px";
          sliderTimer=window.setTimeout(animateShow, sliderSpeed);
         
        };

        function animateClose()
    {
          var h = parseInt(sliderBox.style.height)||sliderHeight;//得到容器的高度
          if (h<=1)
     {//如果高度<1,则清除timeout,并返回
            sliderBox.style.height = sliderHeight+'px';//将容器高度复原,否则下次容器的原始高度就为1像素了
            sliderBox.style.visibility="hidden";
            window.clearTimeout(sliderTimer);
            return sliderActive=false;
          }
          //容器高度-1并递归此关闭函数
          sliderBox.style.height = h-1 +"px";
          sliderTimer=window.setTimeout(animateClose, sliderSpeed);
        };
       
        //此函数的功能为得到一个元素的引用,参数可用元素ID或者元素对象
        function $ (objId)
    {
          if (typeof(objId)=="object") return objId;
          return document.getElementById(objId);
        };

      };
    //]]>
    </script>
  </head>

  <body id="www.never-online.net">
    <h1> Slider Show Demo </h1>
    <hr/>
    <a href="###" onclick="javascript:effect_sliderShow(this,'sliderShowBox')">click show setTimeout demo</a>
   
    <div class="sliderShowBox" id="sliderShowBox">
      <div class="sliderShowContent">
        sliderShow<br/>tutorial of DHTML and javascript programming<br/>by never-online, never-online.net
      </div>
    </div> 
  </body>
</html>

posted @ 2008-07-09 17:49 hcmfys_lover 阅读(23) | 评论 (0)编辑
 

存储过程实现分页

-------------------------------------------------------以下代码为存储过程代码

CREATE procedure   News_Class

--资讯新闻百万级分页

(

@StrWhere     varchar(100),--条件

@PageSize     int,         --页面大小

@PageIndex     int        --页面索引

)

AS

declare   @strSQL         varchar(2000)     -- 主语句

declare   @strCountSQL   varchar(2000)     -- 总记录主语句

declare   @strTmp         varchar(1000)     -- 临时变量

Set @strTmp =" Select top " + str(@PageSize) + " Title,AddTime from Tb_News "   --此处注意,需几个字段读几个字段

if @StrWhere<>''

   Begin

  Set @strSQL=@strTmp + " where ID < (select min(ID) from (select top " + str((@PageIndex-1)*@PageSize)+" ID from Tb_News Where "+@StrWhere+"   order by ID desc)   as tblTmp ) and "+@StrWhere+" order by ID desc"

   set @strCountSQL="select count(ID) as countx from Tb_News Where "+@StrWhere+" "

   End

else

   Begin

   Set @strSQL=@strTmp + " where ID < (select min(ID) from (select top " + str((@PageIndex-1)*@PageSize)+" ID from Tb_News order by ID desc)   as tblTmp ) order by ID desc"

   set @strCountSQL="select count(ID) as countx from Tb_News "

   End

if @PageIndex = 1

   if @StrWhere<>''

       Begin

       Set @strSQL=@strTmp +" Where "+@StrWhere+" order by ID desc"

       End

   else

       Begin

       Set @strSQL=@strTmp +" order by ID desc"

       End

exec (@strSQL)

exec (@strCountSQL)

GO

分页的几种方案,及思路

分页方案一:(利用Not InSELECT TOP分页)

语句形式:

SELECT TOP 10 *

FROM TestTable

WHERE (ID NOT IN

          (SELECT TOP 20 id

         FROM TestTable

         ORDER BY id))

ORDER BY ID

SELECT TOP 页大小 *

FROM TestTable

WHERE (ID NOT IN

          (SELECT TOP 页大小*页数 id

         FROM

         ORDER BY id))

ORDER BY ID

-------------------------------------

分页方案二:(利用ID大于多少和SELECT TOP分页)

语句形式:

SELECT TOP 10 *

FROM TestTable

WHERE (ID >

          (SELECT MAX(id)

         FROM (SELECT TOP 20 id

                 FROM TestTable

                 ORDER BY id) AS T))

ORDER BY ID

SELECT TOP 页大小 *

FROM TestTable

WHERE (ID >

          (SELECT MAX(id)

         FROM (SELECT TOP 页大小*页数 id

                 FROM

                 ORDER BY id) AS T))

ORDER BY ID

-------------------------------------

分页方案三:(利用SQL的游标存储过程分页)

create procedure XiaoZhengGe

@sqlstr nvarchar(4000), --查询字符串

@currentpage int, --N

@pagesize int --每页行数

as

set nocount on

declare @P1 int, --P1是游标的id

@rowcount int

exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output

select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页

set @currentpage=(@currentpage-1)*@pagesize+1

exec sp_cursorfetch @P1,16,@currentpage,@pagesize

exec sp_cursorclose @P1

set nocount off

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。

建议优化的时候,加上主键和索引,查询效率会提高。

通过SQL 查询分析器,显示比较:结论是:

分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句

分页方案一:(利用Not InSELECT TOP分页)   效率次之,需要拼接SQL语句

分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用

posted @ 2008-07-09 09:33 hcmfys_lover 阅读(15) | 评论 (0)编辑
版权所有,转载请注明,来自http://www.jialing.net/  
Ajax(Asynchronous JavaScript and XML)说到底就是一种浏览器异步读取服务器上XML内容的技术。现在的技术凡是跟XML扯上关系,再加上个概念做幌子,就像金装了一样,拽得不行。门外的人看得很是热闹,门里的人摇摇头不外如是。XML呢,跨平台的新潮语言?其实XML=TXT。XML只是符合很多规范的文本。它本身什么都不是,只是保存字符的文件。而浏览器异步读取的只是服务器上的文本内容,所以在Ajax开发时完全不必拘泥于XML。[版权所有,www.jialing.net]

  • JSON的来历

XML的作用是格式化数据内容。如果我们不用XML还有什么更好的方法吗?这个答案是JSON。介绍JSON之前我先介绍一下JavaScript这门脚本语言。脚本语言自身有动态执行的天赋。即我们可以把想要执行的语句放在字符串里,通过eval()这个动态执行函数来执行。字符串里的内容会像我们写的脚本一样被执行。
示例1:
<HTML>
<HEAD>
<TITLE>eval example 1</TITLE>
</HEAD>
<BODY>
<script>
         str 
= "alert('hello')";
         eval(str);

</script>
</BODY>
</HTML>

打开页面会弹出hello窗口。

我们可以在字符串中放任何脚本语句,包括声明语句:
<HTML>
<HEAD>
<TITLE>eval example 2</TITLE>
</HEAD>
<BODY>
<script>
      define 
= "{name:'Michael',email:'17bity@gmail.com'}";   //直接量方式
      eval(
"data = "+define);
      alert(
"name:"+data.name);
      alert(
"email:"+data.email);
</script>
</BODY>
</HTML>

如果我们在后台异步传来的文本是JavaScript的声明语句,那么不是一条eval方法就能解析了?对于解析复杂的XML,这样的效率是多么大的提高啊!

现在就来告诉你什么是JSON:JavaScript Object Notation。我更愿意把它翻译为JavaScript对象声明。比如要从后台载入一些通讯录的信息,如果写成XML,如下:

<contact>
    
<friend>
        
<name>Michael</name>
        
<email>17bity@gmail.com</email>
        
<homepage>http://www.jialing.net</homepage>
    
</friend>
    
<friend>
        
<name>John</name>
        
<email>john@gmail.com</email>
        
<homepage>http://www.john.com</homepage>
    
</friend>
    
<friend>
        
<name>Peggy</name>
        
<email>peggy@gmail.com</email>
        
<homepage>http://www.peggy.com</homepage>
    
</friend>
</contact>


而写成JSON呢:
[
 {
   name:
"Michael",
   email:
"17bity@gmail.com",
   homepage:
"http://www.jialing.net"
 },
 {
   name:
"John",
   email:
"john@gmail.com",
   homepage:
"http://www.jobn.com"
 },
 {
   name:
"Peggy",
   email:
"peggy@gmail.com",
   homepage:
"http://www.peggy.com"
 }
]

简单的不只是表达上,最重要的是可以丢弃让人晕头转向的DOM解析了。因为只要符合JavaScript的声明规范,JavaScrip会自动帮你解析好的。Ajax中使用JSON的基本方法是前台载入后台声明JavaScript对象的字符串,用eval方法来将它转为实际的对象,最后通过DHTML更新页面信息。

  • JSON的格式

JSON的基本格式如下,图片来自json.org:
对象是属性、值对的集合。一个对象的开始于"{",结束于"}"。每一个属性名和值间用":"提示,属性间用","分隔

数组是有顺序的值的集合。一个数组开始于"[",结束于"]",值之间用","分隔。


值可以是引号里的字符串、数字、true、false、null,也可以是对象或数组。这些结构都能嵌套

字符串的定义和C或Java基本一致。


数字的定义也和C或Java基本一致。

posted @ 2008-06-27 15:37 hcmfys_lover 阅读(25) | 评论 (0)编辑
/*
FTPFactory.cs
Better view with tab space=4
use the following line to compile
csc /target:library /out:FTPLib.dll /r:System.Net.DLL FTPFactory.cs
*/
­
­
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Net.Sockets;
­
namespace FtpLib {
­
public class FTPFactory {
­
private string remoteHost,remotePath,remoteUser,remotePass,mes;
private int remotePort,bytes;
private Socket clientSocket;
­
private int retValue;
private Boolean debug;
private Boolean logined;
private string reply;
­
private static int BLOCK_SIZE = 512;
­
Byte[] buffer = new Byte[BLOCK_SIZE];
Encoding ASCII = Encoding.ASCII;
­
public FTPFactory() {
­
remoteHost = "localhost";
remotePath = ".";
remoteUser = "anonymous";
remotePass = "ftpclient@ospreyindia.com";
remotePort = 21;
debug = false;
logined = false;
­
}
public void setRemoteHost(string remoteHost) {
this.remoteHost = remoteHost;
}
public string getRemoteHost() {
return remoteHost;
}
public void setRemotePort(int remotePort) {
this.remotePort = remotePort;
}
public int getRemotePort() {
return remotePort;
}
public void setRemotePath(string remotePath) {
this.remotePath = remotePath;
}
public string getRemotePath() {
return remotePath;
}
public void setRemoteUser(string remoteUser) {
this.remoteUser = remoteUser;
}
public void setRemotePass(string remotePass) {
this.remotePass = remotePass;
}
public string[] getFileList(string mask) {
­
if(!logined) {
login();
}
­
Socket cSocket = createDataSocket();
­
sendCommand("NLST " + mask);
­
if(!(retValue == 150 || retValue == 125)) {
throw new IOException(reply.Substring(4));
}
­
mes = "";
­
   while(true) {
          int bytes = cSocket.Receive(buffer, buffer.Length, 0);
       mes += ASCII.GetString(buffer, 0, bytes);
       if(bytes < buffer.Length) {
break;
}
}
­
char[] seperator = {'\n'};
string[] mess = mes.Split(seperator);
­
cSocket.Close();
­
readReply();
if(retValue != 226) {
throw new IOException(reply.Substring(4));
}
return mess;
­
}
public long getFileSize(string fileName) {
­
if(!logined) {
login();
}
­
sendCommand("SIZE " + fileName);
long size=0;
­
if(retValue == 213) {
size = reply.Substring(4).ToInt64();
}else {
throw new IOException(reply.Substring(4));
}
return size;
­
}
public void login() {
­
clientSocket = new Socket(AddressFamily.AfINet,SocketType.SockStream,ProtocolType.ProtTCP);
IPEndPoint ep = new IPEndPoint(DNS.Resolve(remoteHost), remotePort);
int i = clientSocket.Connect(ep);
if( i != 0 ) {
throw new IOException("Couldn't connect to remote server");
}
­
readReply();
if(retValue != 220) {
close();
throw new IOException(reply.Substring(4));
}
if(debug)
Console.WriteLine("USER "+remoteUser);
sendCommand("USER "+remoteUser);
if( !(retValue == 331 || retValue == 230) ) {
cleanup();
throw new IOException(reply.Substring(4));
}
if( retValue != 230 ) {
if(debug)
Console.WriteLine("PASS xxx");
­
sendCommand("PASS "+remotePass);
if( !(retValue == 230 || retValue == 202) ) {
cleanup();
throw new IOException(reply.Substring(4));
}
}
­
logined = true;
Console.WriteLine("Connected to "+remoteHost);
­
chdir(remotePath);
­
}
public void setBinaryMode(Boolean mode) {
­
if(mode) {
sendCommand("TYPE I");
}else {
sendCommand("TYPE A");
}
if (retValue != 200) {
throw new IOException(reply.Substring(4));
}
}
public void download(string fileName) {
download(fileName,false);
}
public void download(string fileName,Boolean resume) {
­
­
if(!logined) {
login();
}
­
setBinaryMode(true);
long totalSize=0;
try{
totalSize = getFileSize(fileName);
}catch(Exception) {
throw new Exception("File Not Found "+fileName);
}
­
­
Console.WriteLine("Downloading file "+fileName+" from "+remoteHost + "/"+remotePath);
­
if(!File.FileExists(fileName)) {
Stream st = File.Create(fileName);
st.Close();
}
­
FileStream output = new FileStream(fileName,FileMode.Open);
­
Socket cSocket = createDataSocket();
­
long offset = 0;
­
if(resume) {
­
offset = output.Length;
­
if(offset > 0 ) {
             sendCommand("REST "+offset);
             if(retValue != 350) {
            //throw new IOException(reply.Substring(4));
            //Server may not support resuming.
            offset = 0;
             }
         }
­
         if(offset > 0) {
             if(debug) {
                 Console.WriteLine("seeking to " + offset);
}
             long npos = output.Seek(offset,SeekOrigin.Begin);
             Console.WriteLine("new pos="+npos);
         }
}
­
sendCommand("RETR " + fileName);
­
if(!(retValue == 150 || retValue == 125)) {
throw new IOException(reply.Substring(4));
}
­
        float iCnt = 0;
        float per = 0, oldPer = 1;
­
    while(true) {
­
          bytes = cSocket.Receive(buffer, buffer.Length, 0);
          output.Write(buffer,0,bytes);
­
// Showing the progress. 1..50
iCnt += bytes;
per = (int) ( (iCnt / totalSize) * 100 );
if( per != oldPer && per % 2 == 0 ) {
Console.Write(".");
oldPer = per;
}
­
       if(bytes < buffer.Length) {
break;
}
}
­
output.Close();
cSocket.Close();
Console.WriteLine("");
­
readReply();
­
if( !(retValue == 226 || retValue == 250) ) {
throw new IOException(reply.Substring(4));
}
­
}
public void upload(string fileName) {
upload(fileName,false);
}
public void upload(string fileName,Boolean resume) {
­
if(!logined) {
login();
}
­
Socket cSocket = createDataSocket();
long offset=0;
­
if(resume) {
­
try {
­
setBinaryMode(true);
offset = getFileSize(fileName);
­
}catch(Exception) {
offset = 0;
}
}
­
if(offset > 0 ) {
sendCommand("REST " + offset);
if(retValue != 350) {
//throw new IOException(reply.Substring(4));
//Remote server may not support resuming.
offset = 0;
}
}
­
sendCommand("STOR "+fileName);
if( !(retValue == 125 || retValue == 150) ) {
throw new IOException(reply.Substring(4));
}
­
        // open input stream to read source file
        FileStream input = new FileStream(fileName,FileMode.Open);
­
if(offset != 0){
­
    if(debug) {
Console.WriteLine("seeking to " + offset);
}
    input.Seek(offset,SeekOrigin.Begin);
}
­
        //for progress bar
        long totalSize = input.Length - offset;
        float iCnt = 0;
        int per = 0, oldPer = 1;
        Console.WriteLine("Uploading file "+fileName+" to "+remotePath);
­
        while ((bytes = input.Read(buffer,0,buffer.Length)) > 0) {
­
cSocket.Send(buffer, bytes, 0);
­
            // Showing the progress. 1..50
iCnt += bytes;
per = (int) ( (iCnt / totalSize) * 100 );
if( per != oldPer && per % 2 == 0 ) {
Console.Write(".");
oldPer = per;
}
        }
        input.Close();
­
Console.WriteLine("");
­
cSocket.Close();
­
        readReply();
        if( !(retValue == 226 || retValue == 250) ) {
throw new IOException(reply.Substring(4));
}
}
public void deleteRemoteFile(string fileName) {
­
if(!logined) {
login();
}
­
sendCommand("DELE "+fileName);
­
if(retValue != 250) {
throw new IOException(reply.Substring(4));
}
­
}
public void renameRemoteFile(string oldFileName,string newFileName) {
­
if(!logined) {
login();
}
­
sendCommand("RNFR "+oldFileName);
­
if(retValue != 350) {
throw new IOException(reply.Substring(4));
}
­
// known problem
// rnto will not take care of existing file.
// i.e. It will overwrite if newFileName exist
sendCommand("RNTO "+newFileName);
if(retValue != 250) {
throw new IOException(reply.Substring(4));
}
­
}
public void mkdir(string dirName) {
­
if(!logined) {
login();
}
­
sendCommand("MKD "+dirName);
­
if(retValue != 250) {
throw new IOException(reply.Substring(4));
}
­
}
public void rmdir(string dirName) {
­
if(!logined) {
login();
}
­
sendCommand("RMD "+dirName);
­
if(retValue != 250) {
throw new IOException(reply.Substring(4));
}
­
}
public void chdir(string dirName) {
if(dirName.Equals(".")) {
return;
}
­
if(!logined) {
login();
}
­
sendCommand("CWD "+dirName);
­
if(retValue != 250) {
throw new IOException(reply.Substring(4));
}
­
this.remotePath = dirName;
­
Console.WriteLine("Current directory is "+remotePath);
­
}
public void close() {
if( clientSocket != null ) {
sendCommand("QUIT");
}
cleanup();
Console.WriteLine("Closing...");
}
public void setDebug(Boolean debug) {
this.debug = debug;
}
    private void readReply() {
mes = "";
reply = readLine();
        retValue = reply.Substring(0,3).ToInt32();
   }
private void cleanup() {
if(clientSocket!=null) {
clientSocket.Close();
clientSocket = null;
}
logined = false;
}
private string readLine() {
­
    while(true) {
          bytes = clientSocket.Receive(buffer, buffer.Length, 0);
       mes += ASCII.GetString(buffer, 0, bytes);
       if(bytes < buffer.Length) {
break;
}
}
­
char[] seperator = {'\n'};
string[] mess = mes.Split(seperator);
if(mes.Length > 2) {
    mes = mess[mess.Length-2];
}else {
mes = mess[0];
}
if(!mes.Substring(3,1).Equals(" ")) {
return readLine();
}
if(debug) {
for(int k=0;k < mess.Length-1;k++) {
Console.WriteLine(mess[k]);
}
}
return mes;
}
private void sendCommand(String command) {
Byte[] cmdBytes = Encoding.ASCII.GetBytes((command+"\r\n").ToCharArray());
clientSocket.Send(cmdBytes, cmdBytes.Length, 0);
readReply();
}
private Socket createDataSocket() {
­
sendCommand("PASV");
­
if(retValue != 227) {
throw new IOException(reply.Substring(4));
}
­
int index1 = reply.IndexOf('(');
int index2 = reply.IndexOf(')');
string ipData = reply.Substring(index1+1,index2-index1-1);
int[] parts = new int[6];
­
int len = ipData.Length;
int partCount = 0;
string buf="";
for (int i = 0; i < len && partCount <= 6; i++) {
­
char ch = ipData.Substring(i,1).ToChar();
if (Char.IsDigit(ch))
buf+=ch;
else if (ch != ',') {
throw new IOException("Malformed PASV reply: " + reply);
}
­
if (ch == ',' || i+1 == len) {
try {
parts[partCount++] = buf.ToInt32();
buf="";
}
catch (Exception) {
throw new IOException("Malformed PASV reply: " + reply);
}
}
}
­
string ipAddress = parts[0] + "."+ parts[1]+ "." +
parts[2] + "." + parts[3];
­
int port = (parts[4] << 8) + parts[5];
­
Socket s = new Socket(AddressFamily.AfINet,SocketType.SockStream,ProtocolType.ProtTCP);
IPEndPoint ep = new IPEndPoint(DNS.Resolve(ipAddress), port);
­
int sucess = s.Connect(ep);
­
if( sucess != 0 ) {
throw new IOException("Can't connect to remote server");
}
­
return s;
}
­
}
}
­
­
Following is the listing of a test program which uses this library
­
­
/*
­
File : Test.cs
Better view with tab space=4
use the following line to compile
csc.exe /t:exe /r:System.DLL /r:System.Net.DLL /r:FTPLib.dll /out:"Test.exe" "Test.cs"
­
*/
using System;
using FtpLib;
­
public class Test {
­
public static void Main() {
­
try {
­
Console.WriteLine("Starting...");
­
FTPFactory ff = new FTPFactory();
ff.setDebug(true);
ff.setRemoteHost("192.168.10.19");
ff.setRemoteUser("jaimon");
ff.setRemotePass("mathew");
ff.login();
­
string[] fileNames = ff.getFileList("*.*");
for(int i=0;i < fileNames.Length;i++) {
Console.WriteLine(fileNames[i]);
}
ff.download("Readme.zip",true);
ff.close();
­
}catch(Exception e) {
Console.WriteLine("Caught Error :"+e.Message);
}
}
}
posted @ 2008-06-12 09:27 hcmfys_lover 阅读(41) | 评论 (0)编辑

iis只可以运行html就是运行不了asp提示这个东西

Server Application Error The server has encountered an error while loading an application during the processing of your request. Please refer to the event log for more detail information. Please contact the server administrator for assistance.就是这个错误

解决的办法:用以下方法可以解决,方便快捷,浅显易懂^_^“开始”“设置”-“控制面板”-“管理工具”-“组件服务”中,“控制台根目录”-“组件服务”-“计算机”-“我的电脑”-“COM+应用程序”中,有一个“IIS Out-Of-Process Pooled”鼠标右键“属性”--“标识”--把“此用户”调整为“交互式用户--目前已登录的用户”。然后“确定”,再鼠标右键“属性”--“启动”。

前提是一,系统是XP,其它系统不敢包.二,没有做过其它设置.

打开“管理工具”->“组件服务”->“计算机”->“我的电脑”->“COM+应用程序”,(看A) 然后在右边框中,右击“IIS Out-Of-Process Pooled Applications”,(看B)选择属性,点“标识”选项卡,选择“系统帐户”,然后确定,在“服务”(不是刚才那个,打开管理工具-服务)中重启IIS即可。

A.如打开“COM+应用程序”时出现错误,错误代码:“8004E00F-COM+无法与Microsoft分布式事务协调程序 ”
解决办法:在"开始"-“运行“窗口中输入,msdtc -resetlog (注意-前面有一空格)即可。

B.在“COM+应用程序”右框的组件中“IIS Out-Of-Process Pooled Applications”找不到解决办法:
开始菜单->运行->cmd打开命令提示窗口。
输入cd %windir%/system32/inetsrv切换到了system32下inetsrv目录。

再输入rundll32 wamreg.dll, CreateIISPackage。

注意:必须准确键入“CreateIISPackage”,它区分大小写。

再输入regsvr32 asptxn.dll。

关闭"组件服务"并重新打开"组件服务"。

重启IIS:"管理工具"-"服务"找到IIS Admin右击选择"重新启动".

最后打开“管理工具”->“internet信息服务”找到“默认网站”然后右击它,

选择属性,在“TCP地址”处选择本机的IP地址。再打开“目录安全性”->“编辑”弹出“身份验证方法对话框”

这里比较麻烦点。下面说起来有点难,如果上面都对,那100%是下面的问题,如果这里设置不到,打开网页时,将弹出一个对话框确认后出现“未登陆,无权访问”,又或者显示那一行出现错误等。

点击“浏览”->“高级”->“立即查找”在下框选择一个能用的用户(如当前用户),然后确定。

在“匿名访问”处打勾,“允许IIS控制密码”不打勾,密码(你刚才选择的用户的密码,无密码为空,确定密码也为空)。"基本....."不打勾,"集成....."处打勾。然后在刚才“匿名访问”处打过勾的现在又不打勾了。
确定后,先按“应用”会出现一条信息“localstart.asp”(其它文件不要选),用鼠标“点击选择它”(记住,其实就是这里没有选择),再确定。

从新进入刚才的“身份验证方法对话框”,在“匿名访问”处重新打勾再“应用”,

如出现之前的那条信息再点击选择它,再确定,即可完成了。

posted @ 2008-06-02 15:39 hcmfys_lover 阅读(46) | 评论 (1)编辑
      能输入数字:"^[0-9]*$"

  只能输入n位的数字:"^"d{n}$"

  只能输入至少n位的数字:"^"d{n,}$"

  只能输入m~n位的数字:。"^"d{m,n}$"

  只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"

  只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"

  只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"

  只能输入非零的正整数:"^"+?[1-9][0-9]*$"

  只能输入非零的负整数:"^"-[1-9][]0-9"*$

  只能输入长度为3的字符:"^.{3}$"

  只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"

  只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"

 只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"

  只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"

  只能输入由数字、26个英文字母或者下划线组成的字符串:"^"w+$"

  验证用户密码:"^[a-zA-Z]"w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。

  验证是否含有^%&,;=?$""等字符:"[^%&,;=?$"x22]+"

  只能输入汉字:"^["u4e00-"u9fa5]{0,}$"

  验证Email地址:"^"w+([-+.]"w+)*@"w+([-.]"w+)*"."w+([-.]"w+)*$"

  验证InternetURL"^http://(["w-]+".)+["w-]+(/["w-./?%&=]*)?$"

  验证电话号码:"^("("d{3,4}-)|"d{3.4}-)?"d{7,8}$"正确格式为:"XXX-XXXXXXX""XXXX-XXXXXXXX""XXX-XXXXXXX""XXX-XXXXXXXX""XXXXXXX""XXXXXXXX"

  验证身份证号(15位或18位数字)"^"d{15}|"d{18}$"

  验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01""09""1""12"

  验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01""09""1""31"

  利用正则表达式限制网页表单里的文本框输入内容:

 用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^"u4E00-"u9FA5]/g,’’)" onbeforepaste="clipboardData.setData(text,clipboardData.getData(text).replace(/[^"u4E00-"u9FA5]/g,’’))"

用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^"uFF00-"uFFFF]/g,’’)" onbeforepaste="clipboardData.setData(text,clipboardData.getData(text).replace(/[^"uFF00-"uFFFF]/g,’’))"

  用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^"d]/g,’’) "onbeforepaste="clipboardData.setData(text,clipboardData.getData(text).replace(/[^"d]/g,’’))"

  用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/["W]/g,’’) "onbeforepaste="clipboardData.setData(text,clipboardData.getData(text).replace(/[^"d]/g,’’))"

  

得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1

以下是引用片段:

  s="http://www.9499.net/page1.htm"

  s=s.replace(/(.*"/){0,}([^".]+).*/ig,"$2")

  alert(s)

  匹配双字节字符(包括汉字在内)[^"x00-"xff]

   应用:计算字符串的长度(一个双字节字符长度计2ASCII字符计1)

以下是引用片段:

  String.prototype.len=function(){return this.replace([^"x00-"xff]/g,"aa").length;}

匹配空行的正则表达式:"n["s| ]*"r

  匹配HTML标记的正则表达式:/<(.*)>.*<"/"1>|<(.*) "/>/

  匹配首尾空格的正则表达式:(^"s*)|("s*$)

以下是引用片段:

  String.prototype.trim = function()

  {

  return this.replace(/(^"s*)|("s*$)/g, "");

  }

 利用正则表达式分解和转换IP地址:

  下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:

以下是引用片段:

  function IP2V(ip)

  {

  re=/("d+)".("d+)".("d+)".("d+)/g //匹配IP地址的正则表达式

  if(re.test(ip))

  {

  return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1

  }

  else

  {

  throw new Error("Not a valid IP address!")

  }

  }

  不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:

以下是引用片段:

  var ip="10.100.20.168"

  ip=ip.split(".")

  alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

  符号解释:

  "

  将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,’n 匹配字符 "n"。’"n 匹配一个换行符。序列 "" 匹配 """ ""(" 则匹配 "("

  ^

  匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 "n "r 之后的位置。

  $

匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 "n "r 之前的位置。

 *

  匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"* 等价于{0,}

  +

  匹配前面的子表达式一次或多次。例如,’zo+ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"+ 等价于 {1,}

  ?

  匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" "does" 中的"do" ? 等价于 {0,1}

  {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?’。请注意在逗号和两个数之间不能有空格。

  ?

  当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",’o+? 将匹配单个 "o",而 o+ 将匹配所有 o’。  .

  匹配除 ""n" 之外的任何单个字符。要匹配包括 "n 在内的任何字符,请使用象 [."n] 的模式。

  (pattern)

  匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合

,在JScript 中则使用 $0$9 属性。要匹配圆括号字符,请使用 "( ")’。

  (?:pattern)

  匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "" 字符 (|) 来组合一个模式的各个部分是很有用。例如, industr(?:y|ies) 就是一个比 industry|industries 更简略的表达式。

  (?=pattern)

  正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,’Windows (?=95|98|NT|2000) 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

  (?!pattern)

  负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如’Windows (?!95|98|NT|2000) 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

  x|y

  匹配 x y。例如,’z|food 能匹配 "z" "food"。’(z|f)ood 则匹配 "zood" "food"

  [xyz]

  字符集合。匹配所包含的任意一个字符。例如, [abc] 可以匹配 "plain" 中的 a’。

  [^xyz]

  负值字符集合。匹配未包含的任意字符。例如, [^abc] 可以匹配 "plain" 中的’p’。

  [a-z]

  字符范围。匹配指定范围内的任意字符。例如,’[a-z] 可以匹配 a z 范围内的任意小写字母字符。

  [^a-z]

  负值字符范围。匹配任何不在指定范围内的任意字符。例如,’[^a-z] 可以匹配任何不在 a z 范围内的任意字符。

  "b

  匹配一个单词边界,也就是指单词和空格间的位置。例如, er"b 可以匹配"never" 中的 er’,但不能匹配 "verb" 中的 er’。

  "B

  匹配非单词边界。’er"B 能匹配 "verb" 中的 er’,但不能匹配 "never" 中的 er’。

  "cx

  匹配由 x 指明的控制字符。例如, "cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z a-z 之一。否则,将 c 视为一个原义的 c