標籤:php Regex 正則 辛星 教程
首先說一下,這篇文章也是我在看了數個大牛的部落格之後總結出來的,因此首先向這些大牛表示崇高的敬意和感謝,由於人數眾多,而且來源也是特別分散,就不一一介紹了,見諒。
************跨語言的主題**************
1.就如同xml、json、cookie、session、get、post等話題一樣,Regex是一個跨越了語言的話題,幾乎絕大多數語言都支援Regex,可以說,只要這門語言支援字串,它就應該支援Regex,因為很多功能不使用Regex特別麻煩 ,但是使用了Regex就非常簡單。
2.Regex可以用於郵箱、QQ、手機號等的驗證,而且還可以用於採集網頁,當然,說白了,Regex可以勝任絕大多數對於字元文本的操作,當然,對於解析xml等檔案,Regex則顯得並不是很強力,不過Regex對於提取xml中特定的文本資訊,依然非常給力。
3.因此,學好Regex,不論將來轉學哪門語言,都是非常簡單的。
*************Regex的作用**********
1.Regex的主要作用有三個,第一個是正則匹配,第二個是正則替換,第三個是正則提取。
2.所謂正則匹配,是驗證一串文本是否符合某個Regex規則,比如我們驗證使用者的是否是一個郵箱,就用到了正則匹配。
3.所謂正則替換,就是我們把文本中的某些資訊給替換成另外一些資訊,類似於word編輯器中的尋找替換功能,快速錯誤修正。
4.所謂正則提取,即使我們從文本中根據我們的Regex提取出需要的資訊,比如我們從一個html檔案中提取出所有的<img>標籤,然後根據它的src屬性來得到所有的圖片的超連結,這就是從一大串文本資訊中提取自己會用到的資訊 。
5.我們先學習Regex的書寫,然後在學習如何在PHP中使用Regex函數來操作Regex。
****************Regex的書寫規則一***************
1.Regex通常用/來作為定界符,即兩個斜線之間的部分被當做Regex的規則,我們用它去匹配其他的文本,比如/xinxing/這個Regex就表示只能比配字串xinxing。
2.上面我們也看到了,我們的字元是可以出現在Regex中的,它們的作用也就是相當於匹配中的一個字元,但是,Regex也提供了一些元字元來讓我們更加方便的來操作這些字元,這些元字元前面跟一個字元叫做前置字元,一個前置字元和一個元字元一起起作用。
3.我們用+表示其前置字元在目標中連續出現一次或多次,*表示其前置字元在目標中出現零次或者多次,而?則規定其前置對象必須在目標對象中連續出現零次或者一次,其後面的則不管了。
4.比如/xin+/可以匹配到xin,xinnnn,xinn,xinnnnn等,因為這裡的+使得n可以出現一次或者多次,而xin?則可以匹配xinxing,xingui,xinguimeng等字元,只要前面有xin就可以了。
5.元字元是一種很粗糙的指定次數的方式,我們可以採用更加精細的操作,比如{m,n}表示至少出現m次,至多出現n次,{m,}表示至少出現m次,{,n}表示至多出現n次,而{t}表示出現固定的t次。
6.比如/xin{3,4}/可以匹配xinnn和xinnnn這兩種情況。
**************Regex的書寫規則二*****************
1.前面我們可以用單個的字元用來做前置字元,顯然這是很弱的,我們可以有它的boss版,其中\s用於匹配單個空格符,包括定位字元和分行符號,\S表示用於匹配單個除了空格之外的所有字元,\d用於匹配從0到9的字元,\w用於匹配字母數字底線,\W用於所有與\w不匹配的字元,單獨的一個點號.表示撇配除了換行之外的所有字元。從上面的資料可以看出,\s和\S的意義正好相反,\w和\W也是這樣。
2.比如/\s+/可以用於匹配n個空格,/\d00/可以匹配000、100、200等整百的數字。
***************Regex中的定位器和範圍表示*********
1.Regex中還有所謂的定位器的說法,其中^必須出現在字串的開頭,而$則必須出現在字串的結尾,而\b則必須出現在目標字串的開頭或者結尾,而\B則必須不能出現在開頭或者結尾,只能出現在中間部分。
2.其實可以看出^和$是一對反義詞,而\b和\B也是一對反義詞。
3.我們可以用一個中括弧括起來表示一個字元,而在裡面指定範圍,比如/[a-z]/表示小寫字母從a到z,比如/[0-9]/表示小寫字母從0到9的一個數字,比如/[a-c2-6]/表示從a到c或者從2到6的一個字母或者數字相匹配.
4.這種範圍修飾符可以和元字元相連的,比如/[a-z][0-9]+/表示以一個字母作為先導,然後跟一個或者多個數字。
5.還有否定符號^用在中括弧內表示的是排除,比如[^a-c]表示除去abc之外的任一字母,當^位於中括弧內的時候,表示否定,當它位於中括弧外的時候,被視作定位器。
6.我們通常用\表示轉義符號,沒錯,在Regex中,我們也需要用\表示轉義,比如\*就表示匹配*這個符號。
*****************小括弧*****************
1.前面說到,元字元只能作用於其前置字元,我們可以用小括弧把若干個字元括起來,作為一個整體,此時元字元就可以作用於多個字元了。
2.比如a(bc)*表示一個a後面跟著0個或者多個bc。
3.比如a(bc){0,7}表示a後面跟著0個到7個bc都可以。
4.還有一個|表示OR,即邏輯與,表示兩個中選擇一個。
5.比如hi|hello表示匹配hi或者hello,比如(a|b)c表示匹配ac或者bc。
**************小練習****************
1.經過我們前面的介紹,我們這裡進行一下小小的演練,看看我們究竟掌握了多少。
2.其實ab*和ab{0,}表達的意思是相同的,ab?表示匹配a或者ab。
**********************備忘*****************
1.上面我們講解了Regex最主要的部分,還有些細枝末節沒有顧忌到,下面我把比較重要的再說一下。
2.前面我們說到了用/來作為定界符,其實還可以用#作為定界符,它是在Regex中/出現較多的時候用的,此時Regex中的斜線不需要轉義。
3.在Regex的最後加一個i表示不區分大小寫。
4.我們可以分組,也有人稱之為群,即Group,調用格式為(?P<組名>) 調用方式 (?P=組名)。
**************PHP函數****************
1.我們用preg_match來完成正則匹配的功能,它的第一個參數是Regex,第二個參數是要匹配的文本,第三個參數是可選擇,表示匹配到的資訊,其實它有五個參數,但是我們往往用不了那麼多,如下程式碼範例:
<?php//定義一個Regex$reg ="/xi/";//定義一個字元文本$msg ="xinxisgxagxiagslgxigsghg";//這裡使用了全部匹配preg_match_all($reg,$msg,$match);//輸出匹配到的全部資訊print_r($match);
2.上面例子的輸出結果是:
Array ( [0] => Array ( [0] => xi [1] => xi [2] => xi [3] => xi ) )
3.我們可以用preg_replace來進行正則替換,比如我們用如下代碼吧所有的xi都替換為了oo,代碼:
<?php//定義一個Regex$reg ="/xi/";//定義一個字元文本$msg ="xinxisgxagxiagslgxigsghg";//定義替換文本$rep = "oo";//這裡使用了全部匹配$str = preg_replace($reg,$rep,$msg);//輸出匹配到的全部資訊echo $str;
4.輸出結果:oonoosgxagooagslgoogsghg
5.正則分割,是把原字串通過相應的形式進行分割為數組,我們使用preg_split函數,程式碼範例:
<?php//使用逗號或空格來分隔短語$reg = "/[\s,]+/";//定義原字串$msg = "hypertext language, programming";$keywords = preg_split($reg,$msg );print_r($keywords);
6.輸出結果:
Array ( [0] => hypertext [1] => language [2] => programming )
********************總結**********************
1.Regex是典型的難學易忘的知識,希望可以與諸位讀者共勉。
2.我們每到一定的時間就溫習一次。
辛星教你快速掌握PHP的Regex