正則表達式 --很多書都有介紹。

解决方案 »

  1.   

    正则表达式,给你段例子
    通过例子学习正则表达式(一)--基础知识正则表达式的基本语法: 首先,让我们看一看两个特殊符号:'^' 和 '$'.它们的作用是指明一个字符串的开头和结尾.分别像这样: 
    "^The": 对应任何以 "The" 开始的字符串 
    "of despair$": 对应以 "of despair" 结尾的字符串 
    "^abc$": 一个以 "abc" 开头然后结尾的字符串---就是"abc"自己! 
    "notice": 一个包含"notice" 的字符串. 你可以看到如果你两个符号都不使用,就像最后的那个例子,你等于在表述:在字符串的任意位置符合样式都可以,就是说你不管它出现在头还是尾. 还有几个符号 '*', '+', 和 '?',它们表示字符或字符串出现的数目. 他们的意思分别是:"0或更多(任意)", "1或更多(至少1次)", 和"0或1次(至多1次)". 下面有一些例子: 
    "ab*": 对应一个含有一个 a 后跟有任意个 b 的字符串 ("a", "ab", "abbb", 等等.); 
    "ab+": 类似, 不过至少有一个 b ("ab", "abbb", 等等.); 
    "ab?": 要么一个 b 要么没有; 
    "a?b+$": 结尾部分可能有一个 a ,也可能没有,后面是1个以上的 b. 你还可以使用花括号,里面的数字将指明前面字符出现的范围: 
    "ab{2}": 对应含有一个 a 后面跟着2个 b ("abb") 的字符串; 
    "ab{2,}": 至少含有2个b 的("abb", "abbbb", 等等.); 
    "ab{3,5}": 3到5个 b ("abbb", "abbbb", or "abbbbb"). 注意你必须注意范围的第一个数字.(例如:"{0,2}", 不可以是"{,2}"). 同时你可能已经注意到了,字符'*', '+', 和'?'与"{0,}", "{1,}", 和 "{0,1}"的功能是一样的. 现在,来量化一些字符序列/小字符串,把他们放入圆括号里: "a(bc)*": 对应一个含有任意个 "bc" 在 a 后面的字符串; 
    "a(bc){1,5}": 1到5个 "bc" 都可以. 还有'|'字符,作用如同OR,用来选择: 
    "hi|hello": 对应一个有"hi" 或者 "hello" 的字符串; 
    "(b|cd)ef": 一个有 "bef" 或者 "cdef" 的字符串; 
    "(a|b)*c": 一个字符串有任意个a和b 的组合,然后以一个 c 结尾; 
    一个句号('.')表示任意单独字符: 
    "a.[0-9]": 表示拥有一个 a 后面跟着一个字符和一个数字的字符串; 
    "^.{3}$": 有 3 个字符的字符串. 方括号明确指出哪些字符可以出现在某个单个字符的位置: "[ab]": 对应一个有一个 a 或者一个 b (等同于"a|b"); 
    "[a-d]": 一个字符串有小写字母 'a' 到 'd' (等同于 "a|b|c|d" 甚至是 "[abcd]"); 
    "^[a-zA-Z]": 一个开始字符是英文字母的字符串; 
    "[0-9]%": 有一个数字在百分号前的字串; 
    ",[a-zA-Z0-9]$": 一个字符串结尾是逗号后面跟着一个数字或字母. 你可以使用一个列表剔除你不想要的字符--只要使用一个'^'在你的方括号里的第一个位置 (例如, "%[^a-zA-Z]%" 表示在两个百分号之间的一个字符不是英文字母).另外,你必须注意,某些时候,你不必多加一个反斜杠表示特殊字符失效,比如在字符类的第一个位置时.看例子:"($|¥)[0-9]+"的含义可以表示成ereg("(\$|¥)[0-9]+", $str) (这匹配的是什么字符串?) 不要忘记了,在方括号里的所有特殊字符都将失去特殊含义(注: '^'和'-'例外吧),包括反斜杠,例如"[*+?{}.]"就是匹配这些符号中的任意一个. Regex man pages告诉我们:如果包含一个']',你可以把它放在第一个字符位置,也可以在它的前面放一个反斜杠(例如/[abc]]/) 最后,我应该提一下还有如:collating sequences, character classes, 和 equivalence classes之类,我不会再提它们的细节,因为这和本文章的深入关系不大,你可以在regex man pages找到更多内容. 通过例子学习正则表达式(二)--检查"钱"检查一个表示钱的字串(这个翻译有点生硬) OK,现在我们可以用我们刚才学的东西来做一些有用的事情:用一个正则表达式来检查输入的"钱"是否形式正确.有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000".让我们开始: ^[1-9][0-9]*$ 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式: ^(0|[1-9][0-9]*)$ 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号: ^(0|-?[1-9][0-9]*)$ 这表示一个0或者一个可能为负的开头不为0的数字.OK,让我们不要这么严格了.让用户以0开头好了.把负号的匹配也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分: ^[0-9]+(.[0-9]+)?$ 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的. ^[0-9]+(.[0-9]{2})?$ 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样: ^[0-9]+(.[0-9]{1,2})?$ 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样: ^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$ "1到3个数字,后面跟着任意个逗号+3个数字 " 很简单,不是吗?但是让我们使得逗号成为可选,而不是必须: ^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$ 这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里.OK了,当你的验证完成后,用str_replace(",", "", $money)把逗号去掉,然后把它的类型设为double,这样我们可以用它进行计算. 通过例子学习正则表达式(三)--检查E-mail验证E-Mail地址 Ok下面让我们接着看E-MAIL地址.一个E-MAIL地址由3部分组成: 
    POP3用户名('@'左边的那部分), 
    符号'@', 
    服务器名称(剩下的那部分) 一个用户名可能包含:大小写字母, 数字 , 句号'.', 减号'-', 下划线'_'.而一个服务器名也类似,除了不能包含下划线. 还有就是,开头不可以是句号(你见过开头是句号的域名吗?),还有,你不能有两个连续句号,在他们中间至少有一个其他字符.我们先来看看如何验证用户名部分: ^[_a-zA-Z0-9-]+$ 这还不允许句号,再改一改: ^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*$ 这表示至少一个字符,后面跟着任意个"单个句号后随1个以上字符". 为了简单一些,我们可以使用下面的表达式在eregi()函数上(这个函数不分大小写),我们就不用再写全a-z和A-Z,它们中一个就够了. ^[_a-z0-9-]+(.[_a-z0-9-]+)*$ 对于服务器名是一样的,只是不能有下划线: ^[a-z0-9-]+(.[a-z0-9-]+)*$ 完成了,再把这两个合起来,中间加上一个'@',我们得到: ^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$ (旅行注:如果更仔细的话,可以想到,E-MAIL地址服务器名的最后一段字串是2到3个字符) 其他用途 读取字符串的特定段 
    ereg() 和 eregi()有一个特性可以从字符串里按照模式提取出需要的部分(详细内容请阅读手册),例如,从一个路径/URL里读出一个文件名: ereg("([^\/]*)$", $pathOrUrl, $regs); 
    echo $regs[1]; 进阶替换 ereg_replace() 和 eregi_replace() 非常有用.比如我们想把由逗号分隔的单词从字符串里分出来(使用explode当然简单): ereg_replace("[ nrt]+", ",", trim($str)); 一些练习(???有没有搞错) 让你忙一忙吧: 修改验证E-MAIL的表达式使得服务器名至少由两部分组成(提示:改一个字符就可以了) 
    建造一个利用ereg_replace()的函数,使其功能类似于trim() 
    建造一个利用ereg_replace()的函数,将字符串里的 '#', '@', '&', 和 '%' 替换成 '~'. 设置时间的格式可在webconfig里设置globalization小节里,添加区域设置culture="zh-cn"不同的设置,使用System.DateTime.Now.ToString()得到不到的结果如: culture="en-US"6/23/2003 10:12:45 AM culture="zh-cn"2003-6-23 10:12:10  culture="fr-FR"23/06/2003 10:11:17culture="fr-FR"  在对用户控件进行输入验证时的正则表达式使用<tr>
          <td align=right>
            <font face=宋体 size=2>电子邮件:</font>
          </td>
          <td>
            <ASP:TextBox id=TextBox1 runat=server />
          </td>
          <td>
            <asp:RequiredFieldValidator id="RequiredFieldValidator1" runat="server"
                ControlToValidate="TextBox1"
                Display="Dynamic"
                Font-Name="Verdana" Font-Size="10pt"
                >
                *
            </asp:RequiredFieldValidator>
     
            <asp:RegularExpressionValidator id="RegularExpressionValidator1" runat="server"
                ControlToValidate="TextBox1"
                ValidationExpression="^[\w-]+@[\w-]+\.(com|net|org|edu|mil)$"
                Display="Static"
                Font-Name="verdana" Font-Size="10pt">
                    请输入一个有效的电子邮件地址
            </asp:RegularExpressionValidator>
          </td>
     </tr>
     IP地址表达式^(2[0-5]{2}|1?[0-9]{1,2}).(2[0-5]{2}|1?[0-9]{1,2}).(2[0-5]{2}|1?[0-9]{1,2}).(2[0-5]{2}|1?[0-9]{1,2})$<tr>     <td><asp:textbox id="txtValue" Runat="server" Width="100"></asp:textbox>               <asp:RegularExpressionValidator id="RegularExpressionValidator1" runat="server" ControlToValidate="txtValue" ValidationExpression="^(2[0-5]{2}|1?[0-9]{1,2}).(2[0-5]{2}|1?[0-9]{1,2}).(2[0-5]{2}|1?[0-9]{1,2}).(2[0-5]{2}|1?[0-9]{1,2})$" Display="Static" Font-Name="verdana" Font-Size="10pt">               请输入一个有效的IP地址               </asp:RegularExpressionValidator>     </td></tr>