官术网_书友最值得收藏!

5.5 正則表達式語法規則

一般情況下,正則表達式由兩部分組成,分別是元字符和文本字符。元字符就是具有特殊含義的字符,例如“? ”和“*”等,文本字符就是普通的文本,例如字母和數字等。本節主要講述正則表達式的語法規則。

1.方括號([ ])

方括號內的一串字符是將要用來進行匹配的字符。例如正則表達式在方括號內的[name]是指在目標字符串中尋找字母n、a、m、e。[jjk]表示在目標字符串中尋找字符j和k。

2.連字符(-)

在很多情況下,不可能逐個列出所有字符。比如,若要匹配所有英文字符,則把26個英文字母全部輸入會十分困難。這樣就有如下表示:

● [0-9]表示匹配從0到9的任意十進制數。

● [A-Za-z] 表示匹配英文大小寫從大寫A到小寫z的任意字符。

● [A-Z]表示匹配英文大寫從A到Z的任意字符。

● [a-z]表示匹配英文小寫從a到z的任意字符。

由于字母和數字的區間固定,所以根據這樣的表示方法,即[開始-結束],程序員可以重新定義區間大小,如[2-7]、[c-f]等。

3.點號字符(.)

點號字符在正則表達式中是一個通配符,它代表所有字符和數字,例如,“.er”表示所有以er結尾的三個字符的字符串,可以是per、ser、ter、@er、&er等。

4.限定符(+*? {n, m})

加號“+”表示其前面的字符至少有一個。例如,“9+”表示目標字符串包含至少一個9。

星號“*”表示其前面的字符不止一個或零。例如,“y*”表示目標字符串包含0或不止一個y。

問號“? ”表示其前面的字符為一個或零。例如,“y? ”表示目標字符串包含0或一個y。

大括號“{n, m}”表示其前面的字符有n或m個。例如,“a{3,5}”表示目標字符串包含3個或5個a。“a{3}”表示目標字符串包含3個a。“a{3, }”表示目標字符串包含至少3個a。

點號和星號可以一起使用,如“.*”表示匹配任意字符。

5.行定位符(^和$)

行定位符用來確定匹配字符串所要出現的位置。

如果是在目標字符串開頭出現,則使用符號“^”;如果是在目標字符串結尾出現,則使用符號“$”。例如,^xiaoming是指xiaoming只能出現在目標字符串開頭。8895$ 是指8895只能出現在目標字符串結尾。

同時使用“^$”這兩個符號,如“^[a-z]$”,表示目標字符串要只包含從a到z的單個字符。

6.排除字符([^])

符號“^”在方括號內所代表的意義則完全不同,它表示一個邏輯“否”。排除匹配字符串在目標字符串中出現的可能,例如[^0-9]表示目標字符串包含從0到9“以外”的任意其他字符。

7.括號字符(( ))

括號字符表示子串,所有對包含在子串內字符的操作,都是以子串為整體進行的。括號字符也是把正則表達式分成不同部分的操作符。

8.選擇字符(|)

選擇字符表示“或”選擇。例如,“com|cn|com.cn|net”表示目標字符串包含com或cn或com.cn或net。

9.轉義字符(\)與反斜線(\)

由于“\”在正則表達式中屬于特殊字符,如果單獨使用此字符,則直接表示為作為特殊字符的轉義字符。如果要表示反斜杠字符本身,則在此字符前添加轉義字符“\”,即“\\”。

10.認證email的正則表達

在處理表單數據的時候,對用戶的email進行認證是十分常用的。如何判斷用戶輸入的是一個email地址呢?就是用正則表達式匹配。它的格式如下。

    ^[A-Za-z0-9_.]+@[ A-Za-z0-9_]+\.[ A-Za-z0-9.]+$

其中^[A-Za-z0-9_.]+表示,至少有一個英文大小寫字符、數字、下劃線、點號,或者這些字符的組合。@表示email中的“@”。[ A-Za-z0-9_]+表示,至少有一個英文大小寫字符、數字、下劃線,或者這些字符的組合。\.表示email中“.com”之類的點。由于這里點號只是點本身,所以用反斜杠對它進行轉義。[ A-Za-z0-9.]+$表示,至少有一個英文大小寫字符、數字、點號,或者這些字符的組合,并且直到這個字符串的末尾。

11.如何使用正則表達式對字符串進行匹配

使用正則表達式對目標字符串進行匹配是正則表達式的主要功能。

完成這個操作需要用到ereg()函數。這個函數用于在目標字符串中尋找符合特定正則表達規范的字符串子串,根據指定的模式來匹配文件名或字符串。其中ereg()函數對字符大小寫不敏感。它的語法格式如下:

    ereg(正則表達規范,目標字符串,數組)

提示:另外用戶也可以使用eregi()函數對字符串進行匹配,它和ereg()函數最大區別是對字符大小寫敏感。

下面介紹利用正則表達規范匹配email輸入的方法和技巧。

【例5.12】(實例文件:ch05\5.12.php)

    <? php
      $email = "wangxioaming2011@hotmail.com";                 //定義字符串
      $email2 = "The email is liuxiaoshuai_2011@hotmail.com";
      $asemail = "This is wangxioaming2011@hotmail";
      $regex =  '^[a-zA-Z0-9_.]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9.]+$';  //定義正則表達式
規范
      $regex2 =  '[a-zA-Z0-9_.]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9.]+$';
      if(ereg($regex, $email, $a)){                            //利用正則表達式規范字符串
          echo "This is an email.";
      print_r($a);
      echo "<br />";
      }
      if(ereg($regex2, $email2, $b)){
          echo "This is a new email.";
       print_r($b);
       echo "<br />";
      }
      if(ereg($regex, $asemail)){
          echo "This is an email.";
      }else{
          echo "This is not an email.";
      }
    ?>

運行結果如圖5-12所示。

圖5-12 程序運行結果

【案例分析】:

(1)其中,$email就是一個完整的email字符串,用$regex這個正則規范,也就是匹配email的規范來匹配$email,得出的結果為圖中第一行輸出。

(2)由于ereg()函數的格式,ereg($regex, $email, $a)把匹配的子串存儲在名為$a的數組中。print_r($a)打印數組,得出結果為第一行數組輸出。

(3)其中,$email2就是一個包含了完整email的字符串。用$regex匹配,其返回值必然為false。用$regex2規范匹配,其返回值為真。因為$regex2規范中去掉了表示從字符串頭部開始的符號“^”。ereg($regex2, $email2, $b)把匹配的子串存儲在數組$b中。print_r($b),得到第二行數組的輸出。

(4)$asemail字符串不符合規范$regex,返回值為false,得到相應輸出。

12.使用正則表達式替換字符串子串

完成字符串及其子串的匹配后,如果需要對字符串的子串進行替換,也可以使用正則表達式完成。這種需求,比如把輸入文本中的url完成可以直接點擊的連接。此操作需要使用ereg_replace()和eregi_replace()函數。其中ereg_replace()對大小寫敏感,而eregi_replace()對大小寫不敏感。其格式為:

    ereg_replace(正則表達規范,欲取代字符串子串,目標字符串)

提示:另外用戶也可以使用eregi_replace ()函數對字符串進行替換,它和ereg_replace ()函數最大區別是對字符大小寫敏感。

通過以下實例,介紹利用正則表達式取代字符串子串的方法和技巧。

【例5.13】(實例文件:ch05\5.13.php)

    <? php
    $searchurl = "這是搜索引擎連接:http://www.google.com/和http://www.baidu.com/。
";
    echo                                     ereg_replace("(http://)([a-zA-Z0-9./-_]+)", "<a
href=\"\\0\">\\0</a>", $searchurl);
    echo "<br />";
    echo                                     ereg_replace("(http://)([a-zA-Z0-9./-_]+)", "<a
href=\"\\0\">\\2</a>", $searchurl);
    ?>

運行結果如圖5-13所示。

圖5-13 程序運行結果

【案例分析】:

(1)其中,$searchurl里面包含兩個url文本。ereg_replace()按照格式對$searchurl里的url進行匹配替換。

(2)正則規范為"(http://)([a-zA-Z0-9./-_]+)",它分為兩部分,即(http://)和([a-zA-Z0-9./-_]+),前者直接匹配,后者用正則語法匹配。

(3)第一行的輸出,替換為"<a href=\"\\0\">\\0</a>"。里面的“\\0”把反斜杠轉義后表示的是“\0”,“\0”表示正則規則中所有部分匹配的內容。第二行的輸出,替換為"<a href=\"\\0\">\\2</a>",里面的“\\2”把反斜杠轉義后表示的是“\2”,“\2”表示正則規則中第二部分匹配的內容,輸出如圖5-12所示。依次類推,“\1”表示的是第一部分匹配的內容,即(http://)。

13.使用正則表達式切分字符串

使用正則表達式可以把目標字符串按照一定的正則規范切分成不同的子串。完成此操作要用到strtok()函數,它的語法格式為:

    strtok(正則表達式規范,目標字符串)

這個函數指以正則規范內出現的字符為準,把目標字符串切分成若干個子串,并且存入數組。

下面通過實例,介紹利用正則表達式切分字符串的方法和技巧。

【例5.14】(實例文件:ch05\5.14.php)

    <? php
      $string = "Hello world. Beautiful day today."; //定義字符串
      $token = strtok($string, " ");              //切分字符串
      while ($token ! == false)                 //使用while循環輸出切分后的字符串
        {
        echo "$token<br />";
        $token = strtok(" ");
        }
    ?>

運行結果如圖5-14所示。

圖5-14 程序運行結果

【案例分析】:

(1)其中,$string為包含多種字符的字符串。strtok($string, " ")對其進行切分,并將結果存入數組$token。

(2)其正則規范為" ",是指以空格將字符串切分。

主站蜘蛛池模板: 石渠县| 大同县| 旌德县| 阳高县| 特克斯县| 桃源县| 汾西县| 延津县| 连州市| 屏边| 伊川县| 清涧县| 黑龙江省| 金门县| 岳阳县| 扶余县| 岳西县| 宜昌市| 阿克| 隆昌县| 新安县| 明水县| 宁武县| 财经| 隆化县| 普定县| 丹江口市| 邯郸县| 东丽区| 五台县| 三台县| 仪征市| 通渭县| 江都市| 霍城县| 广丰县| 黄大仙区| 襄樊市| 太保市| 团风县| 承德县|