PHP正則表達式的快速學習方法

一、入門簡介php

簡單的說,正則表達式是一種能夠用於模式匹配和替換的強有力的工具。咱們能夠在幾乎全部的基於UNIX系統的工具中找到正則表達式的身影,例如,vi編輯器,Perl或PHP腳本語言,以及awk或sed shell程序等。此外,象JavaScript這種客戶端的腳本語言也提供了對正則表達式的支持。因而可知,正則表達式已經超出了某種語言或某個系統的侷限,成爲人們廣爲接受的概念和功能。
正則表達式可讓用戶經過使用一系列的特殊字符構建匹配模式,而後把匹配模式與數據文件、程序輸入以及WEB頁面的表單輸入等目標對象進行比較,根據比較對象中是否包含匹配模式,執行相應的程序。
  舉例來講,正則表達式的一個最爲廣泛的應用就是用於驗證用戶在線輸入的郵件地址的格式是否正確。若是經過正則表達式驗證用戶郵件地址的格式正確,用戶所填寫的表單信息將會被正常處理;反之,若是用戶輸入的郵件地址與正則表達的模式不匹配,將會彈出提示信息,要求用戶從新輸入正確的郵件地址。因而可知正則表達式在WEB應用的邏輯判斷中具備舉足輕重的做用。html

二、基本語法正則表達式

在對正則表達式的功能和做用有了初步的瞭解以後,咱們就來具體看一下正則表達式的語法格式。
正則表達式的形式通常以下:
/love/
其中位於「/」定界符之間的部分就是將要在目標對象中進行匹配的模式。用戶只要把但願查找匹配對象的模式內容放入「/」定界符之間便可。爲了可以使用戶更加靈活的定製模式內容,正則表達式提供了專門的「元字符」。所謂元字符就是指那些在正則表達式中具備特殊意義的專用字符,能夠用來規定其前導字符(即位於元字符前面的字符)在目標對象中的出現模式。
較爲經常使用的元字符包括: 「+」, 「*」,以及 「?」。其中,「+」元字符規定其前導字符必須在目標對象中連續出現一次或屢次,「*」元字符規定其前導字符必須在目標對象中出現零次或連續屢次,而「?」元字符規定其前導對象必須在目標對象中連續出現零次或一次。
下面,就讓咱們來看一下正則表達式元字符的具體應用。
/fo+/
由於上述正則表達式中包含「+」元字符,表示能夠與目標對象中的 「fool」, 「fo」, 或者 「football」等在字母f後面連續出現一個或多個字母o的字符串相匹配。
/eg*/
由於上述正則表達式中包含「*」元字符,表示能夠與目標對象中的 「easy」, 「ego」, 或者 「egg」等在字母e後面連續出現零個或多個字母g的字符串相匹配。
/Wil?/
由於上述正則表達式中包含「?」元字符,表示能夠與目標對象中的 「Win」, 或者 「Wilson」,等在字母i後面連續出現零個或一個字母l的字符串相匹配。
除了元字符以外,用戶還能夠精確指定模式在匹配對象中出現的頻率。例如,
/jim{2,6}/
上述正則表達式規定字符m能夠在匹配對象中連續出現2-6次,所以,上述正則表達式能夠同jimmy或jimmmmmy等字符串相匹配。
在對如何使用正則表達式有了初步瞭解以後,咱們來看一下其它幾個重要的元字符的使用方式。
\s:用於匹配單個空格符,包括tab鍵和換行符;
\S:用於匹配除單個空格符以外的全部字符;
\d:用於匹配從0到9的數字;
\w:用於匹配字母,數字或下劃線字符;
\W:用於匹配全部與\w不匹配的字符;
. :用於匹配除換行符以外的全部字符。
(說明:咱們能夠把\s和\S以及\w和\W看做互爲逆運算)
下面,咱們就經過實例看一下如何在正則表達式中使用上述元字符。
/\s+/
上述正則表達式能夠用於匹配目標對象中的一個或多個空格字符。
/\d000/
若是咱們手中有一份複雜的財務報表,那麼咱們能夠經過上述正則表達式垂手可得的查找到全部總額達千元的款項。shell

除了咱們以上所介紹的元字符以外,正則表達式中還具備另一種較爲獨特的專用字符,即定位符。定位符用於規定匹配模式在目標對象中的出現位置。
較爲經常使用的定位符包括: 「^」, 「$」, 「\b」 以及 「\B」。其中,「^」定位符規定匹配模式必須出如今目標字符串的開頭,「$」定位符規定匹配模式必須出如今目標對象的結尾,\b定位符規定匹配模式必須出如今目標字符串的開頭或結尾的兩個邊界之一,而「\B」定位符則規定匹配對象必須位於目標字符串的開頭和結尾兩個邊界以內,即匹配對象既不能做爲目標字符串的開頭,也不能做爲目標字符串的結尾。一樣,咱們也能夠把「^」和「$」以及「\b」和「\B」看做是互爲逆運算的兩組定位符。舉例來講:
/^hell/
由於上述正則表達式中包含「^」定位符,因此能夠與目標對象中以 「hell」, 「hello」或 「hellhound」開頭的字符串相匹配。
/ar$/
由於上述正則表達式中包含「$」定位符,因此能夠與目標對象中以 「car」, 「bar」或 「ar」 結尾的字符串相匹配。編程

/\bbom/
由於上述正則表達式模式以「\b」定位符開頭,因此能夠與目標對象中以 「bomb」, 或 「bom」開頭的字符串相匹配。
/man\b/
由於上述正則表達式模式以「\b」定位符結尾,因此能夠與目標對象中以 「human」, 「woman」或 「man」結尾的字符串相匹配。
爲了可以方便用戶更加靈活的設定匹配模式,正則表達式容許使用者在匹配模式中指定某一個範圍而不侷限於具體的字符。例如:
/[A-Z]/
上述正則表達式將會與從A到Z範圍內任何一個大寫字母相匹配。
/[a-z]/
上述正則表達式將會與從a到z範圍內任何一個小寫字母相匹配。
/[0-9]/
上述正則表達式將會與從0到9範圍內任何一個數字相匹配。
/([a-z][A-Z][0-9])+/
上述正則表達式將會與任何由字母和數字組成的字符串,如 「aB0」 等相匹配。這裏須要提醒用戶注意的一點就是能夠在正則表達式中使用 「()」 把字符串組合在一塊兒。「()」符號包含的內容必須同時出如今目標對象中。所以,上述正則表達式將沒法與諸如 「abc」等的字符串匹配,由於「abc」中的最後一個字符爲字母而非數字。
若是咱們但願在正則表達式中實現相似編程邏輯中的「或」運算,在多個不一樣的模式中任選一個進行匹配的話,可使用管道符 「|」。例如:
/to|too|2/
上述正則表達式將會與目標對象中的 「to」, 「too」, 或 「2」 相匹配。
正則表達式中還有一個較爲經常使用的運算符,即否認符 「[^]」。與咱們前文所介紹的定位符 「^」 不一樣,否認符 「[^]」規定目標對象中不能存在模式中所規定的字符串。例如:
/[^A-C]/
上述字符串將會與目標對象中除A,B,和C以外的任何字符相匹配。通常來講,當「^」出如今 「[]」內時就被視作否認運算符;而當「^」位於「[]」以外,或沒有「[]」時,則應當被視作定位符。
最後,當用戶須要在正則表達式的模式中加入元字符,並查找其匹配對象時,可使用轉義符「\」。例如:
/Th\*/
上述正則表達式將會與目標對象中的「Th*」而非「The」等相匹配。服務器

三、使用實例編輯器

①PHP中可使用ereg()函數進行模式匹配操做。ereg()函數的使用格式以下:
 函數

如下爲引用的內容:
  ereg(pattern, string)

  其中,pattern表明正則表達式的模式,而string則是執行查找替換操做的目標對象。一樣是驗證郵件地址,使用PHP編寫的程序代碼以下:工具

< ?php 
   if (ereg(「^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+」,$email)){ 
              echo 「Your email address is correct!」;} 
   else{ 
              echo 「Please try again!」; 
      } 
?>學習


②JavaScript 1.2中帶有一個功能強大的RegExp()對象,能夠用來進行正則表達式的匹配操做。其中的test()方法能夠檢驗目標對象中是否包含匹配模式,並相應的返回true或false。

 

咱們可使用JavaScript編寫如下腳本,驗證用戶輸入的郵件地址的有效性。

 

如下爲引用的內容:
 <html> 
   <head> 
    <script language=\"Javascript1.2\"> 
     <!-- start hiding 
     function verifyAddress(obj) 
     { 
      var email = obj.email.value; 
      var pattern = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/; 
      flag = pattern.test(email); 
      if(flag) 
      { 
       alert(「Your email address is correct!」); 
       return true; 
      } 
      else 
       { 
        alert(「Please try again!」); 
        return false; 
        } 
      } 
     // stop hiding --> 
    </script> 
   </head> 
   <body> 
   <form onSubmit=\"return verifyAddress(this);\"> 
   <input name=\"email\" type=\"text\"/> 
   <input type=\"submit\"/> 
   </form> 
  </body> 
 </html>


想必不少人都對正則表達式都頭疼。今天,我以個人認識,加上網上一些文章,但願用常人均可以理解的表達方式。來和你們分享學習經驗。

 

開篇,仍是得說說 ^ 和 $ 他們是分別用來匹配字符串的開始和結束,如下分別舉例說明:

「^The」:開頭必定要有」The」字符串;
「of despair$」:結尾必定要有」of despair」 的字符串;

那麼,
「^abc$」:就是要求以abc開頭和以abc結尾的字符串,其實是隻有abc匹配;
「notice」:匹配包含notice的字符串;

你能夠看見若是你沒有用咱們提到的兩個字符(最後一個例子),就是說模式(正則表達式)能夠出如今被檢驗字符串的任何地方,你沒有把他鎖定到兩邊。

接着,說說 ‘*’ ‘+’ 和 ‘?’
他們用來表示一個字符能夠出現的次數或者順序,他們分別表示:
「zero or more」至關於{0,}
「one or more」至關於{1,}
「zero or one.」至關於{0,1}

這裏是一些例子:

「ab*」:和ab{0,}同義,匹配以a開頭,後面能夠接0個或者N個b組成的字符串(」a」, 「ab」, 「abbb」, 等);
「ab+」:和ab{1,}同義,同上條同樣,但最少要有一個b存在 (」ab」 「abbb」等);
「ab?」:和ab{0,1}同義,能夠沒有或者只有一個b;
「a?b+$」:匹配以一個或者0個a再加上一個以上的b結尾的字符串。

要點:’*’ ‘+’ 和 ‘?’ 只管它前面那個字符。

你也能夠在大括號裏面限制字符出現的個數,好比:

「ab{2}」: 要求a後面必定要跟兩個b(一個也不能少)(」abb」);
「ab{2,}」: 要求a後面必定要有兩個或者兩個以上b(如」abb」 「abbbb」 等);
「ab{3,5}」: 要求a後面能夠有2-5個b(」abbb」, 「abbbb」, or 「abbbbb」)。

如今咱們把必定幾個字符放到小括號裏,好比:

「a(bc)*」: 匹配 a 後面跟0個或者一個」bc」;
「a(bc){1,5}」: 一個到5個 「bc」;

還有一個字符 ‘|’,至關於OR操做:

「hi|hello」: 匹配含有」hi」 或者 「hello」 的 字符串;
「(b|cd)ef」: 匹配含有 「bef」 或者 「cdef」的字符串;
「(a|b)*c」: 匹配含有這樣多個(包括0個)a或b,後面跟一個c的字符串;

一個點(’.’)能夠表明全部的單一字符,不包括」\n」

若是,要匹配包括」\n」在內的全部單個字符,怎麼辦?

用’[\n.]’這種模式。

「a.[0-9]」: 一個a加一個字符再加一個0到9的數字;
「^.{3}$」: 三個任意字符結尾。

中括號括住的內容只匹配一個單一的字符

「[ab]」: 匹配單個的 a 或者 b ( 和 「a│b」 同樣);
「[a-d]」: 匹配’a’ 到’d’的單個字符 (和」a│b│c│d」 還有 「[abcd]」效果同樣);

通常咱們都用[a-zA-Z]來指定字符爲一個大小寫英文:

「^[a-zA-Z]」: 匹配以大小寫字母開頭的字符串;
「[0-9]%」: 匹配含有 形如 x% 的字符串;
「,[a-zA-Z0-9]$」: 匹配以逗號再加一個數字或字母結尾的字符串;

你也能夠把你不想要得字符列在中括號裏,你只須要在總括號裏面使用’^’ 做爲開頭 「%[^a-zA-Z]%」 匹配含有兩個百分號裏面有一個非字母的字符串。

要點:^用在中括號開頭的時候,就表示排除括號裏的字符。

爲了PHP可以解釋,你必須在這些字符面先後加」,而且將一些字符轉義。

不要忘記在中括號裏面的字符是這條規路的例外—在中括號裏面,全部的特殊字符,包括(」),都將失去他們的特殊性質 「[*\+?{}.]」匹配含有這些字符的字符串:

還有,正如regx的手冊告訴咱們:」若是列表裏含有’]’,最好把它做爲列表裏的第一個字符(可能跟在’^’後面)。若是含有’-’,最好把它放在最前面或者最後面, or 或者一個範圍的第二個結束點[a-d-0-9]中間的‘-’將有效。

看了上面的例子,你對{n,m}應該理解了吧。要注意的是,n和m都不能爲負整數,並且n老是小於m。這樣,才能 最少匹配n次且最多匹配m次。如」p{1,5}」將匹配 「pvpppppp」中的前五個p

下面說說以\開頭的

\b 書上說他是用來匹配一個單詞邊界,就是…好比’ve\b’,能夠匹配love裏的ve而不匹配very裏有ve

\B 正好和上面的\b相反。例子我就不舉了

…..忽然想起來….能夠到 http://www.phpv.net/article.php/251 看看其它用\開頭的語法

好,咱們來作個應用:如何構建一個模式來匹配貨幣數量的輸入。

構建一個匹配模式去檢查輸入的信息是否爲一個表示money的數字。咱們認爲一個表示money的數量有四種方式:」10000.00″ 和 「10,000.00″,或者沒有小數部分,」10000″ and 「10,000″。如今讓咱們開始構建這個匹配模式:

^[1-9][0-9]*$

這是所變量必須以非0的數字開頭。但這也意味着單一的」0″也不能經過測試。如下是解決的方法:

^(0|[1-9][0-9]*)$

「只有0和不以0開頭的數字與之匹配」,咱們也能夠容許一個負號在數字以前:

^(0|-?[1-9][0-9]*)$

這就是:0或者一個以0開頭且可能有一個負號在前面的數字。好了,如今讓咱們別那麼嚴謹,容許以0開頭。如今讓咱們放棄負號,由於咱們在表示錢幣的時候並不須要用到。咱們如今指定模式用來匹配小數部分:

^[0-9]+(\.[0-9]+)?$

這暗示匹配的字符串必須最少以一個阿拉伯數字開頭。可是注意,在上面模式中 「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})?$

不要忘記’+’能夠被’*’替代若是你想容許空白字符串被輸入話,也不要忘記反斜杆’\’在php字符串中可能會出現錯誤 (很廣泛的錯誤):

如今,咱們已經能夠確認字符串了,咱們如今把全部逗號都去掉str_replace(」,」, 「」, $money)而後在把類型當作double而後咱們就能夠經過他作數學計算了。

再來一個:

構造檢查email的正則表達式

在一個完整的email地址中有三個部分:

1. 用戶名 (在 ‘@’ 左邊的一切)
2.’@’
3. 服務器名(就是剩下那部分)

用戶名能夠含有大小寫字母阿拉伯數字,句號(’.’)減號(’-’)and下劃線’_’)。服務器名字也是符合這個規則,固然下劃線除外。

如今,用戶名的開始和結束都不能是句點,服務器也是這樣。還有你不能有兩個連續的句點他們之間至少存在一個字符,好如今咱們來看一下怎麼爲用戶名寫一個匹配模式:

^[_a-zA-Z0-9-]+$

如今還不能容許句號的存在。咱們把它加上:

^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$

上面的意思就是說:以致少一個規範字符(除了.)開頭,後面跟着0個或者多個以點開始的字符串。

簡單化一點, 咱們能夠用eregi()取代ereg()、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-]+)*$

這就是完整的email認證匹配模式了,只須要調用:

eregi(」^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$」,$eamil)

就能夠獲得是否爲email了

正則表達式的其餘用法

提取字符串

ereg() and eregi() 有一個特性是容許用戶經過正則表達式去提取字符串的一部分(具體用法你能夠閱讀手冊)。好比說,咱們想從 path/URL 提取文件名,下面的代碼就是你須要:

ereg(」([^\\/]*)$」, $pathOrUrl, $regs);
echo $regs[1];

高級的代換

ereg_replace() 和 eregi_replace()也是很是有用的,假如咱們想把全部的間隔負號都替換成逗號:

ereg_replace(」[ \n\r\t]+」, 「,」, trim($str));

最後,我把另外一串檢查EMAIL的正則表達式讓看文章的你來分析一下:

「^[-!#$%&\’*+\\./0-9=?A-Z^_`a-z{|}~]+’.’@’.’[-!#$%&\’*+\\/0-9=?A-Z^_`a-z{|}~]+\.’.’[-!#$%&\’*+\\./0-9=?A-Z^_`a-z{|}~]+$」

若是能方便的讀懂,那這篇文章的目的就達到了。

相關文章
相關標籤/搜索