正则表达式

一.正则表达式(regular expression)的概念:

     
    正则表达式就是一套专门用于处理文本的强大工具,可以对进行文本查找,匹配,替换;
    正则表达式常用于验证表单提交的内容,比如验证电话号码,Email地址,身份证号码等是否有效;
 
    php支持两种风格的正则表达式:Perl风格   Posix 风格
 
    Perl风格
 
      PCRE全称为Perl Compatible Regular Expression,意思是Perl兼容正则表达式。
 
      PCRE来源于Perl语言,而Perl是对字符串操作功能最强大的语言之一,PHP的最初版本就是由Perl开发的产品。
 
      在PCRE中,通常将正则表达式 包含在两个反斜线"/"之间;
 
      例:"/apple/"
 
      定界符也不仅仅局限于"/"。除了字母、数字和斜线"\"以外的任何字符都可以作为定界符,像"#"、"/"、"!"等都可以的。
 
    Posix 风格
 
      一般而言,实现相同的功能Perl风格的,效率高些,我们一般使用Perl风格的函数!
 
 
    检查email地址的合法性
 
      1.用字符串查找的方法:
 
        function is_email($email)
        {
          $has_at = strpos($email, "@");    //检查是否 包含@
          $has_dot = strpos($email, ".");   //检查是否包含.
 
          if($has_at && $has_dot ){
            return true;
          }else{
            return false
          }
        }
 
        echo is_email("tom@php.net");       //true
        echo is_email("tom@php");           //false
 
 
    2.使用正则表达式的方法:
 
        function is_email($email){
 
            return preg_match('/^[a-zA-Z]+@[a-zA-Z]+\.[a-zA-Z]+$/',$email);
 
        }
         
        echo is_email("tom@php.net"); //true
 
        echo is_email("tom@php");     //false
 
 
 
    二、Perl 兼容正则表达式函数
 
        1. preg_match()         进行正则表达式匹配
            '/hello/'           进行匹配的模式
            "hello world"       匹配的字符串
            $res                将匹配的结果存放到一个变量里面
            preg_match("/hello/","hello world",$res);
           
 
        2. preg_match_all()   进行正则表达式全局匹配
 
            preg_match_all("/h/","hello hello",$res);   //全匹配
 
        3. preg_replace()     执行正则表达式的搜索和替换
 
            "/hello/"             被匹配字符串的模式
            "aaaaa"               用来匹配的字符串
            "hello world"         从哪个字符串里面匹配
            $res = preg_replace("/hello/","aaaa","hello world");
            var_dump($res); //aaaa  world
 
        4、preg_split()   用正则表达式分割字符串
 
            '/ /'           用于搜索的模式, 字符串形式. 分隔符
            $str            用于分割的字符串
            
            $str = 'hypertext hanguage hrogramming';
            $chars = preg_split('/ /', $str);
            var_dump($chars);   //array()
 
 
 
        5、preg_grep()   返回与模式匹配的数组单元 
 
            "/111/"        匹配模式 
            $array         被匹配的元素
 
            $array = array(3324,111,222,33,44,55);
            $fl_array = preg_grep("/111/", $array);
            var_dump($fl_array);      array(1) { [1]=> string(3) "111" }
             
   
  三、POSIX 扩展正则表达式函数
 
      1. ereg()           搜索跟正则表达式pattern匹配的一个字符串。区分大小写。搜索到返回true,否则返回false
         "(hello)"        代表匹配模式
         "hello world"    代表匹配字符串
         $res             用来存放结果
           
         ereg("(hello)","hello world",$res);
         var_dump($res);
 
 
 
      2. eregi ()         eregi()函数功能与ereg()相同,只是不区分大小写;
 
         "(hello)"        代表匹配模式
         "hello world"    代表匹配字符串
         $res             用来存放结果
 
         eregi("(hello)","hello world",$res);
         var_dump($res);
       
 
      3. ereg_replace()     搜索跟正则表达式pattern匹配的一个字符串,并用新的字符串代替所有这个表达式出现的地方
         "(hello)"          代表替换模式
         "aaaaa"            替换字符串
         "hello world"      被替换的字符串
 
        $res = ereg_replace("(hello)","aaaa","hello world");
        var_dump($res);   //string(10) "aaaa world"
       
 
      4. eregi_replace()   eregi_replace()函数功能与ereg_replace相同,只是不区分大小写;   
         "(HELLO)"          代表替换模式
         "aaaaa"            替换字符串
         "hello world"      被替换的字符串
     
         $res = eregi_replace("(HELLO)","aaaa","hello world");
         var_dump($res);   //string(10) "aaaa world"
 
  四.正则表达式的构成
 
      1.模式
      模式是正则表达式最基本的元素,它们是一组描述字符串特征的字符;
      模式可以很简单,由普通的字符串组成, 也可以很复杂,包含很多的特殊字符;
      验证身份证号码:'/^[1-9][0-9]{14}([0-9]{2}[0-9xX])?$/'
      验证手机号码:'/^(13[0-9]|15[0-356]|18[025-9])\d{8}$/'
      验证URL地址:"^(http|ftp|https)://(www\.)?[a-zA-Z0-9\-]+\.(com|net|org|cn)$"
 
 
 
      2.元字符(特殊字符)
 
      *          匹配前面的字符零次或多次  等同于 {0,} 
 
        preg_match("/a*/","bbbbba",$res); //array(1) { [0]=> string(0) "" }
 
      +          匹配前面的字符一次或多次  等同于 {1,}
 
        preg_match("/a+/",'bbbbbbbbbbaa',$res); string(2) "aa"
 
      ?          匹配前面的字符零次或一次  等同于 {0,1}
 
        preg_match("/a?/","aaaabbbb",$res); //"a"
 
      |          匹配两个或多个选择         
 
        preg_match("/(h|a)+/","dfghsssssasfgdsf",$res);
 
      ^          匹配字符串的开始位置  
 
        preg_match("/^hello/","hello world",$res); 
 
      $          匹配字符串结束位置  
 
        preg_match("/^hello world$/","hello world",$res);
 
      \b         匹配单词的边界(如空格、横杠,但不包括下划线)  *更简单点说 \b匹配特殊字符*
 
        preg_match("/hello\b/","hello-world",$res); 
 
      \B         匹配除单词边界以外的部分      *更简单点说 \B匹配除了特殊字符以外的字符*    
 
        preg_match("/\Bc+/","aaaa -  bbbb - aaac",$res_test);  
 
      []         匹配方括号中的任一字符                       
 
        preg_match("/[abcdf]/","aaaa -  bbbb - aaac",$res_test); 
 
      [^]        匹配除方括号中的字符外的任何字符     
 
        preg_match("/[^abcdf]/","asd",$res_test);   
 
      {m}        m 是一个非负整数。匹配确定的 m 次   
 
        preg_match("/\d+/","asdasdasdad  3434",$res);
 
      {m,}       m 是一个非负整数。至少匹配m 次
 
      {m,n}      最少匹配 m次且最多匹配 n次
 
      ()         表示一个整体
 
      .          匹配除换行之外的任何一个字符
       
      3.预定义元字符
 
      由于某些模式会反复用到,所以可以使用以下预定义类;
 
      \d    匹配一个数字;等价于[0-9]     
 
            preg_match("/\d+/","asdasdasdad  3434",$res);
 
      \D    匹配除数字以外任何一个字符;等价于[^0-9] 
 
            preg_match("/\D+/","asdasdasdad  3434",$res);
 
      \w    匹配一个英文字母、数字或下划线;等价于[0-9a-zA-Z_]
 
            preg_match("/\w+/","asdasdasdad  3434",$res);
 
      \W    匹配除英文字母、数字和下划线以外任何一个字符;等价于[^0-9a-zA-Z_] 
 
            preg_match("/\W+/","asdasdasdad  3434",$res);
 
      \s    匹配一个空白字符;等价于[\f\n\r\t\v]     
 
            preg_match("/\s+/","asdasdasdad  3434",$res);
 
      \S    匹配除空白字符以外任何一个字符;等价于[^\f\n\r\t\v]  
 
            preg_match("/\S+/","asdasdasdad  3434",$res);
 
 
      4.匹配字符的开始和结束
 
        在某些情况下,需要对匹配范围进行限定,以获得更准确的匹配结果;
 
        "^"置于字符串的开始确保模式匹配出现在字符串首端;
 
        "$"置于字符串的结束,确保模式匹配出现字符串尾端。
 
         如果不加边界限制元字符,将获得更多的匹配结果。
 
        $res = preg_match("/^hello/", "hello world");
        var_dump($res);
        $res = preg_match("/world$/", "hello world");
        var_dump($res);
 
 
      5.匹配任意字符
 
          "."匹配除换行符外任何一个字符
 
          $res = preg_match('/./', "something");
          var_dump($res);
 
          通常可以使用".*"组合来匹配除换行符外的任何字符
 
      6.匹配包含某个范围的字符
 
          "[start-end]"匹配包含某个范围的字符
 
          [a-z] 匹配所有的小写字母
          [A-Z] 匹配所有的大写字母
          [a-zA-Z]  匹配所有的字母
          [0-9] 匹配所有的数字
          [0-9\.\-] 匹配所有的数字,句号和减号  
 
          $res = preg_match("^[a-z]+$", "abc");
          var_dump($res);
 
 
      7.重复匹配
          正则表达式中有一些用于重复匹配的元字符:"?""*""+"。他们主要的区
          别是重复匹配的次数不同。
 
          "?" 匹配前面的字符零次或一次  等同于 {0,1}
          "*" 匹配前面的字符零次或多次  等同于 {0,}
          "+" 匹配前面的字符一次或多次  等同于 {1,}
 
          "{m}"   匹配确定的 m 次。 m 是一个非负整数;
          "{m,n}" 最少匹配 m 次且最多匹配 n 次。 m 和 n 均为非负整数,其中m <= n;
          "{m,}"    至少匹配m 次。 m 是一个非负整数;
 
 
      8.匹配两个或多个选择
 
          用圆括号"(word1|word2|…)"定义包含word1、word2、…的任意字符串的规则
 
          $res= preg_match ('/^(this|the)/', 'this island is a beautiful land');
          var_dump($res);
 
      9,模式修正符 : 模式修正符在正则表达式定界符之外使用。
 
          i   在和模式进行匹配时不区分大小写                              
              preg_match("/hello/i","HELLO WORLD",$res);
 
          m   将字符串视为多行      
              $str = 'bcd
              abc
              cba';
              preg_match_all('/^abc/m',$str,$arr);
              print_r($arr);              
 
          s   模式中的圆点元字符 “ . “将匹配所有的字符,包括换行符       
              $str = 'adsadsa
              c';
              preg_match_all('/a.*c/s',$str,$arr);
              print_r($arr);
 
          x   模式中的空白忽略不计,除非已经转义                         
              preg_match_all("/^    hello /x","hello",$res);
 
               
          U   取消贪婪匹配                                       
              $pattern = '/<b>.*<\/b>/U';
              $string = '<b>welcome</b> <b>to</b> <b>phpfuns</b>';
              preg_match($pattern,$string,$res);
 
 
          $str='21PhP8';
          //不区分大小写
          $preg='/php/i';
          //拿到所有匹配的
          $res= preg_match($preg,$str);
          var_dump($res);
 
      练习:
 
        1.分析email地址的规则,写一个函数,用于验证email地址;
 
        2.分析电话号码的规则,写一个函数,用于验证电话号码;
</b>
posted @ 2015-10-15 12:40  -JackoChan  阅读(240)  评论(0)    收藏  举报