php正则表达式深入

<?php
正则表单php中有2套正则函数 .1:  PCRE库  2 : POSIX库 提供的函数(POSIX库被弃用)
在php中 一个正则分成三个部分  分隔符、表达式、修饰符
分隔符    /  #    %   !  ~  一般用/
修饰符:用于开启或关闭某种功能或模式


学习测试工具:火狐扩展 Regular  Expression   Tester 进行测试





正则表单中的元字符

her   he    heet
\bhe\b        //匹配 he
//"\b"   代表单词的开头或结尾,也就是单词的分界处


一、元字符
        .    //匹配除了换行符以外的任意字符
        \w   // 匹配字母或数字或下划线或汉字
        \s   //匹配任意空白符
        \d   //匹配数字
        \b  //匹配单词的开始或者结束
        ^    //匹配字符串的开始
        $    //匹配字符串的结束
         -   //表示范围    1-9
         []   //匹配括号中的任意一个字符
         *  +   ?    //量词


下面看一些列子
(1).匹配以字母a开始的单词
\ba\w*\b
(2)  匹配1个或更多的数字
\d+
(3) 匹配6个字符的单词
\b\w{6}\b   //匹配  action  123456   ste_ph等
注意 正则表达式里"单词"指不少于1个的连续字母和数字



二、量词
        *   //重复0 或者更多次
        +    //重复1次或者更多次
        ?   //重复0次或者1次
        {n}  //重复n次
        {n,} //重复n次或者更多次
        {n,m}//重复n到m次



三、字符组   字符组里面的元字符不用转义 就是代表该符号
        [aeiou]   //匹配任何一个英文元音字母
        [.?!]     //匹配标点符号(.   ?   !)其中一个标点符号
        c[aou]t   //匹配  cat  cot  cut  这3个单词   而caout  则不匹配


四、转义
        一般用 反斜杠 \ 转义   ,还有一种是 用 \Q和\E扩起来里面的内容就是本身

        baidu\.com   匹配 baidu.com
        c:\\windows   匹配 c:\windows
        
        
        \d+\Q.$.\E$  //匹配一个或者多个数字,紧接着是一个点号,然后是一个$ ,再然后是一个点号 ,最后是字符串的尾部,\Q和\E之间的元字符都会作为普通字符用来匹配


五、反义
        \W  匹配任意不是字母、数字、下划线、汉字的字符
        \S 匹配任意不是空白符的字符
        \D 匹配任意非数字的字符
        \B 匹配不是单词开头或结束的位置
        [^x]   //匹配除了x 以外的任意字符
        [^aeiou]  //匹配除了aeiou这几个字母以外的任意字符

        列子
        1.不包含空白符的字符串
        \S+
        2.用尖括号扩起来、已a开头的字符串
        <a[^>]+>
        匹配 <a href="http://www.baidu.com" >

六、分支
     要匹配
    cat,hat,fat,toat
    (c|h|f|to)at    //  | 表示分支,   ()表示一个整体  也叫分组  后面提到


    [ch]at =  (c|h)at

思考以下案例
        0\d{2}-\d{8} | 0\d{3}-\d{7}
        这个表单 式   能匹配2种连字号的电话号码 一种是3位区号8位本地号(如010-12345678)
        
        一种是4位区号7位本地号(如0376-2233445)


七、分组
常用分组语法
捕获       
        (exp)  匹配exp,并捕获文本到自动命名的组里
        (?<name>exp)  匹配exp,并捕获文本到名称为name的组里, 也可以写成 (?'name'exp)
        (?:exp)   匹配exp 不捕获匹配的文本,也不给此分组分配组号

零宽断言    
    
    (?=exp)   //匹配exp前面的位置
    (?<=exp)  //匹配exp后面的位置
    (?!exp)  //匹配后面跟的不是exp的位置
    (?<!exp)  //匹配前面不是exp的位置

注释
    (?#comment)  //提供注释辅助阅读,不对正则表达式的处理产生任何影响


    简单的ip地址匹配
    (\d{1,3}\.){3}\d{1,3}
    上面会匹配 256.300.800.900  显然不对

    ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
    默认情况下,每个分组都有拥有一个组号,规则,从左向右,以分组的左括号为标志,第一个出现的分组组号为1,第二为2,分组0 对应整个正则表达式

    也可以指定子表单式的组名,语法如下:
    ?<Word>\w+

    ?'Word'\w+  
这样就把\w+组名指定为Word


八、反向引用
\b(\w+)\b\s+\1\b
以上表达式可以匹配重复的单词 如go go   或者 kitty kitty
要反向引用分组捕获的内容 可以使用 "\k<Word>" 所以上面也可以写成这样
\b(?<Word>\w+)\b\s+\k<Word>\b









列子:UBB标签[url]1.gif[/url]用于插入表情的,在解析时需要把1.gif换成对应的路径,并且需要用html的img标签替换,方法如下所示





环视
1.顺序肯定环视(?=exp)

        \b\w+(?=ing\b)
        以上表达式查找一下句子时,会匹配  sing 和danc
        i am  singing while you are dancing


2.逆序肯定环视(?<=exp)
    (?<=\bre)\w+\b
    reading a book    //  匹配 ading


\b\w*q[^u]\w*\b  //以上表达式匹配的是含字母q但后面不是u的单词
但是出现Iraq   ,Benq    q在最后面的时候,他就会出错  因为[^u] //必须匹配一个

可以这么解决
            \b\w*q(?!u)\w*\b
3.
顺序否定环视
c(?![au]t\b)\w+t   //匹配  chart等   不匹配 cat cut

4.
逆序否定环视
    (?<![a-z])\d{7}    //前面不是小写字母的7位数字





贪婪/懒惰匹配
默认贪婪匹配  尽可能的匹配多的
a.*b      // aabab   就是贪婪匹配
a.*?b     //匹配a开始以b结束的 短字符串

懒惰限定符合
   *?      //重复任意次,但尽可能少重复
   +?       //重复1次或等多次, 但尽可能少重复
   ??       //重复0次或1次  ,但尽可能少重复
   {n,m}?    //重复n到m次 ,但尽可能少重复
   {n,}?    //重复n次以上,但尽可能少重复


<div>logo</div>
(?<=<div>).*(?=</div>)  //匹配除logo



m|food 和(m|f)ood的区别  考虑 优先级
    m 或者food
    mood 或者food



正则的常用模式
i   忽略大小写模式
m   多行模式
s   点号通配模式
U    懒惰模式

    #\[url\](.*)\[\/url\]#U
    和
    #\[url\](.*?)\[\/url\]#   //等价的



D  结尾限制
"abc\n"
    %abc$%   //匹配的
%abc$%D //不匹配








正则在实际开发中的应用
            <?php
                $mobile="13500000000";
                $regex="!^(13[4-9]|15[0189]|188)\d{8}$!";
                if(!preg_match()){
                    die('错误');
                }else{
                    die('yes');
                }

            匹配E-email地址
            ^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$

            apache 重写  

正则表达式的效率与优化
            (a|b|c|d|e|f|g)
            [abcdefg]
            [a-g]    
            //第一种最慢不要用.  二三差不多

            标准量词是匹配优先级的
            copy2003y
            \w*(\d+)     \d匹配3  //\w*为匹配全部,然后慢慢一个一个吐出来, \d得到3结束
            \w*?(\d+)     \d匹配2003


            慎用点员字符


            合理使用字符串函数代替

            合适使用括号 每次使用一次括号,而不是非捕获型括号(?:....)就会保留一部分内存等着再次访问

            起始、行描点优化
                    ^(?:abc|123) 比  ^123|^abc 效率高
                    ^(abc) 比(^abc)效率高

            使用正则以外的解决方案
                php5 提供  filter函数
                filter_var('admin@example.com'FILTER_VALIDATE_EMAIL);

                JAVASCRIPT 里面 用DOM代替一些正则匹配
                php的字符串函数
                php的 tokenizer 系类函数
                php的url 函数及一些http函数
                php的filter 系列函数
                javascript的dom 模型








        




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值