PHP中的正則表達式函數
在PHP中有兩套正則表達式函數庫。一套是由PCRE(Perl Compatible Regular Expression)庫提供的,基於傳統型NFA。PCRE庫使用和Perl相同的語法規則實現了正則表達式的模式匹配,其使用以“preg_”為前綴命名的函數。另一套是由POSIX(Portable Operation System interface)擴展庫提供的,基於POSIX NFA。POSIX擴展的正則表達式由POSIX 1003.2定義,一般使用以“ereg_”為前綴命名的函數。
兩套函數庫的功能相似,執行效率稍有不同。一般而言,實現相同的功能,使用PCRE庫的效率略占優勢。下面詳細介紹其使用方法。
正則表達式的匹配
1.preg_match()
函數原型:int preg_match (string pattern,stringpattern,stringcontent [, array $matches])
preg_match ()函數在content字符串中搜索與content字符串中搜索與pattern給出的正則表達式相匹配的內容。如果提供了matches,則將匹配結果放入其中。matches,則將匹配結果放入其中。matches[0]將包含與整個模式匹配的文本,$matches[1]將包含第一個捕獲的與括號中的模式單元所匹配的內容,以此類推。該函數只 作一次匹配,最終返回0或1的匹配結果數。
2.ereg()和eregi()
ereg()是POSIX擴展庫中正則表達式的匹配函數。eregi()是ereg()函數的忽略大小寫的版 本。二者與preg_match的功能類似,但函數返回的是一個布爾值,表明匹配成功與否。需要說明的是,POSIX擴展庫函數的第一個參數接受的是正則 表達式字符串,即不需要使用分界符。
3.preg_grep()
函數原型:array preg_grep (string pattern,arraypattern,arrayinput)
preg_grep()函數返回一個數組,其中包括了input數組中與給定的input數組中與給定的pattern模式相匹配的單元。對於輸入數組$input中的每個元素,preg_grep()也只進行一次匹配。代碼6.3給出的示例簡單地說明了preg_grep()函數的使用。
進行全局正則表達式匹配
1.preg_match_all()
與preg_match()函數類似。如果使用了第三個參數,將把所有可能的匹配結果放入。本函數返回整個模 式匹配的次數(可能為0),如果出錯返回False。
2.多行匹配
僅僅使用POSIX下的正則表式函數,很難進行復雜的匹配操作。例如,對整個文件(尤其是多行文本)進行匹配查找。使用ereg()對此進行操作的一個方法是分行處理。
正則表達式的替換
1.ereg_replace()和eregi_replace()
函數原型:string ereg_replace (string pattern,stringpattern,stringreplacement, string $string)
string eregi_replace (string pattern,stringpattern,stringreplacement, string $string)
ereg_replace()在string中搜索模式字符串string中搜索模式字符串pattern,並將所匹配結果替換 為replacement。當replacement。當pattern中包含模式單元(或子模式)時,replacement中形如“\1”或“replacement中形如“\1”或“1”的位置將依次被這些子 模式所匹配的內容替換。而“\0”或“$0”是指整個的匹配字符串的內容。需要注意的是,在雙引號中反斜線作為轉義符使用,所以必須使用“\\0”,“ \\1”的形式。
eregi_replace()和ereg_replace()的功能一致,只是前者忽略大小寫。
2.preg_replace()
函數原型:mixed preg_replace (mixed pattern,mixedpattern,mixedreplacement, mixed subject[,intsubject[,intlimit])
preg_replace較ereg_replace的功能更加強大。其前三個參數均可以使用數組;第四個參數$limit可以設置替換的次數,默認為全部替換。
正則表達式的拆分
1.split()和spliti()
函數原型:array split (string pattern,stringpattern,stringstring [, int $limit])
本函數返回一個字符串數組,每個單元為string經正則表達式string經正則表達式pattern作為邊界分割出的子串。如 果設定了limit,則返回的數組最多包含limit,則返回的數組最多包含limit個單元。而其中最后一個單元包含了$string中剩余的所有部分。spliti是split的 忽略大小版本。
2.preg_split()
本函數與split函數功能一致。