




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、正則表達式在字符串處理中的應用/*編程技術*/作者 高洛峰初次接觸正則表達式的人除了感覺它有些繁瑣外,還會有一種深不可測的感覺。其實正則表達式就是描述字符排列模式的一種自定義的語法規則,在PHP給我們提供的系統函數中,使用這種模式對字符串進行匹配、查找、替換及分割等操作,它的應用非常廣泛。例如,常見的使用正則表達式去驗證用戶在表單中提交的用戶名、密碼、E-mail地址、身份證號碼及電話號碼等格式是否合法;在用戶發布文章時,將輸入有URL的地方全部加上對應的鏈接;按所有標點符號計算文章中一共有多少個句子;抓取網頁中某種格式的數據等等。正則表達式并不是PHP自己的產物,在很多領域都會見到它的應用,
2、除了在Perl、C#及JAVA語言中應用外,在我們的B/S架構軟件開發中,Linux操作系統、前臺JavaScript腳本、后臺腳本PHP以及MySQL數據庫中都可以應用到正則表達式。正則表達式簡介/a-zA-z+:/s*/ /匹配網址URL的正則表達式/<(S*?)>*>.*?</1>|<.*? />/i /匹配HTML標記的正則表達式/w+(-+.w+)*w+(-.w+)*.w+(-.w+)*/ /匹配Email地址的正則表達式正則表達式也稱為模式表達式,自身具有一套非常完整的、可以編寫模式的語法體系,提供了一種靈活且直觀的字符串處理方法。正則表達
3、式通過構建具有特定規則的模式,與輸入的字符串信息比較,從而實現字符串的匹配、查找、替換及分割等操作。下例中給出了3個模式,都是按照正則表達式的語法規則構建的。如下所示:不要被上例中看似亂碼的字符串給嚇退,它們就是按照正則表達式的語法規則構建的模式,是一種由普通字符和具有特殊功能的字符組成的字符串。而且要將這些模式字符串,放在特定的正則表達式函數中使用才有效果。學完本文以后就可以自由應用這樣的代碼了。在PHP中支持兩套正則表達式的處理函數庫。一套是由PCRE(Perl Compatible Regular Expression)庫提供的,與Perl語言兼容的正則表達式函數。使用“preg_”為前
4、綴命名的函數,而且表達式都應被包含在定界符中,如斜線(/)。另一套是由POSIX(Portable Operation System interface)擴展語法的正則表達式函數,使用以“ereg_”為前綴命名的。兩套函數庫的功能相似,執行效率稍有不同。一般而言,實現相同的功能,使用第一種PCRE庫提供的正則表達式效率略占優勢。所以在本文中主要介紹使用“preg_”為前綴命名的正則表達式函數,如表1所示:表1 與Perl語言兼容的正則表達式處理函數函數名功能描述preg_match()進行正則表達式匹配preg_match_all()進行全局正則表達式匹配preg_replace()執行正則表
5、達式的搜索和替換preg_split()用正則表達式分割字符串preg_grep()返回與模式匹配的數組單元preg_replace_callback()用回調函數執行正則表達式的搜索和替換正則表達式的語法規則/<a.*?(?: |t|r|n)?href='"?(.+?)'"?(?:(?: |t|r|n)+.*?)?>(.+?)</a.*?>/sim/獲取鏈接地址正則表達式描述了一種字符串匹配的模式,通過這個模式在特定的函數中對字符串進行匹配、查找、替換及分割等操作。正則表達式作為一個匹配的模板,是由原子(普通字符,例如字符a到z)、
6、有特殊功能的字符(稱為元字符,例如*、+和?等)以及模式修正符三部分組成的文字模式。一個最簡單的正則表達式模式中,至少也要包含一個原子,如“/a/”。而且在與Perl兼容的正則表達式函數中使用模式時,一定要給模式加上定界符,即將模式包含在兩個反斜線“/”之間。一個HTML鏈接地址的正則表達式模式如下所示:在網頁中任何屬于HTML有效的鏈接標簽,都可以和這個正則表達式的模式匹配上。該模式就用到了編寫正則表達式模板的原子、元字符和模式休正符三個組成部分,將其拆分后如下所示:¨ 定界符是使用的是兩個反斜線“/”,將模式放在它之間聲明¨ 原子用到了<、a、href、=、
7、9;、"、/、>等普通字符和t、r、n等轉義字符¨ 元字符使用了、()、|、.、?、*、+等具有特殊含義的字符¨ 用到的模式修正符是在定界符最后一個反斜線之后的三個字符“s”、“i”和“m”<?php$pattern='/<a.*?(?: |t|r|n)?href='"?(.+?)'"?(?:(?: |t|r|n)+.*?)?>(.+?)</a.*?>/sim'$content="請進單擊進入<a href=''>LAMP兄弟連</a
8、>技術社區。"if(preg_match($pattern, $content) /使用preg_match()函數進行正則表達式的模式匹配echo "成功匹配,在第二個參數中包含有效的HTML鏈接標簽字符串。" else echo "在第二個參數的字符串中搜索不到有效的HTML鏈接標簽。" ?>對于原子、元字符以及模式修正符的使用將在后面詳細介紹。首先編寫一個示例,了解一下正則表達式的應用。通過PHP中給我們提供的preg_match()函數,使用上例中定義的正則表達式模式。該函數有兩個必選參數,第一個參數需要提供用戶編寫的正則表
9、達式模式,第二個參數需要一個字符串。該函數的作用就是在第二個字符串參數中,搜索與第一個參數給出的正則表達式匹配的內容。如果匹配成功則返回真。代碼如下所示:在上面的代碼中,使用正則表達式的語法規則,定義一個匹配HTML中鏈接標簽的模式并存放在變量$pattrn中。又定義了一個字符串變量$content,在字符串中如果包含有效的HTML鏈接標簽,則使用preg_match()函數時,就可以按$pattrn模式所定義的格式搜索到鏈接標簽。Ø 定界符/</w+>/ /使用反斜線作為定界符號合法|(d3)-d+|Sm /使用豎線“”作為定界符號合法!(?i)php34! /使用感嘆
10、號“!”作為定界符號合法s+(s+)?$ /使用花括號“”作為定界符號合法/href='(.*)' /非法定界符號,缺少結束定界符 1-d3-d3-d4| /非法定界符號,缺少起始定界符在程序語言中,使用與Perl兼容的正則表達式,通常都需要將模式表達式放入定界符之間。作為定界的字符也不僅僅局限于使用反斜線“/”。除了字母、數字和正斜線“”以處的任何字符都可以作為定界符號,例如“#”、“!”、“”和“”等都是可以的。通常習慣都將模式表達式包含在兩個反斜線“/”之間。下例是一些模式表達式的應用,如下所示:Ø 原子原子是正則表達式的最基本的組成單位,而且在每個模式中最少要
11、包含一個原子。原子是由所有那些未顯式指定為元字符的打印和非打印字符組成,包括所有的大寫和小寫字母字符、所有數字、所有標點符號以及一些其它符號。例如az、AZ、09、雙引號“”、單引號“”等。還包括一些非打印字符,如表2所示列出了正則表達式中常用的非打印字符及其含義:表2 正則表達式中常用的非打印字符原子字符含義描述cx匹配由x指明的控制字符。例如,cM匹配一個Control-M或回車符。x的值必須為A-Z或a-z之一。否則,將c視為一個原義的'c'字符。f匹配一個換頁符。等價于x0c和cL。n匹配一個換行符。等價于x0a和cJ。r匹配一個回車符。等價于x0d和cM。s匹配任何空
12、白字符,包括空格、制表符、換頁符等等。等價于fnrtv。S匹配任何非空白字符。等價于fnrtv。t 匹配一個制表符。等價于x09和cI。v匹配一個垂直制表符。等價于x0b和cK。Ø 元字符利用Perl正則表達式還可以做另一件有用的事情,這就是使用各種元字符來搜索匹配。所謂元字符,就是用于構建正則表達式的具有特殊含義的字符,例如的“*”、“+”、“?”等。如果要在正則表達式中包含元字符本身,使其失去特殊的含義則必須在前面加上“”進行轉義。正則表達式有以下特殊字符,如表3所示:表3 正則表達式的元字符元字符含義描述d匹配任意一個十進制數字,等價于0-9D匹配任意一個除十進制數字
13、以外的字符,等價于0-9s匹配任意一個空白字符,等價于fnrtvS匹配除空白字符以外任何一個字符,等價于fnrtvw匹配任意一個數字、字母或下劃線,等價于0-9a-zA-Z_W匹配除數字、字母或下劃線以外的任意一個字符,等價于0-9a-zA-Z_*匹配0次、1次或多次其前的原子+匹配1次或多次其前的原子?匹配0次或1次其前的原子.匹配除了換行符外的任意一個字符|匹配兩個或多個分支選擇n表示其前面的原子恰好出現n次n, 表示其前面的原子出現不少于n次n, m表示其前面的原子至少出現n次,最多出現m次或A匹配輸入字符串的開始位置(或在多行模式下行的開頭,即緊隨一換行符之后)$或Z匹配輸入字符串的結
14、束位置(或在多行模式下行的結尾,即緊隨一換行符之前)b匹配單詞的邊界B匹配除單詞邊界以外的部分匹配方括號中指定的任意一個原子匹配除方括號中的原子以外的任意一個字符()匹配其整體為一個原子,即模式單元。可以理解為由多個單個原子組成的大原子構造正則表達式的方法和創建數學表達式的方法相似,就是用多種元字符與操作符將小的表達式結合在一起來創建更大的表達式。正則表達式的組件可以是單個的字符、字符集合、字符范圍、字符間的選擇或者所有這些組件的任意組合。元字符是組成正則表達式的最重要部分,下面將這些元字符分為幾類分別講解。Ø 通用字符類型/0-9a-ZA-Z_+0-9a-ZA-Z_+(.0-9a-
15、ZA-Z_+)0,3$/ /E-mail的正則表達式模式/w+w+(.w+)0,3$/ /同上通用字符類型可以匹配相應類型中的一個字符,例如“d”可以匹配數字類型中的任意一個十進制數字。共有6種通用字符類型,包括“d”和“D”、“s”和“S”、“w”和“W”。當然也可以使用原子表制定出這種通用字符類型,例如0-9和“d”的功能一樣,都可以匹配一個十進制數字。但使用通用字符類型要方便得多,如下所示:上面兩個正則表達式的模式作用一樣,都是匹配電子郵件的格式。很顯然使用通用字符類型“w”要比使用原子表“0-9a-zA-Z_”的格式清晰得多。Ø 限定符/as*b/ /“s”表示空白原子,可以
16、匹配在a和b之間沒有空白、一個或有多個空白情況/ad+b/ /可以匹配在a和b之間有一個或有多個數字的情況,如a2b、a34567b等/aW?b/ /可以匹配在a和b之間有一個或有沒有特殊字符,如ab、a#b、a%b等/ax4b/ /可以匹配在a和b之間必須有4個x的字符串,如axxxxb/ax2,b/ /可以匹配在a和b之間至少要有2個x的字符串,如axxb、axxxxxxb等/ax2,4b/ /可以匹配在a和b之間至少有2個和最多有4個x的字符串,如axxb、axxxb和axxxxb限定符用來指定正則表達式的一個給定原子必須要出現多少次才能滿足匹配。有“*”、“+”、“?”、“n”、“n,
17、”以及“n,m”共6種限定符,他們之間的區別主要是重復匹配的次數不同。其中“*”、“+”和“n, ”限定符都是貪婪的,因為它們會盡可能多的匹配文字。如下所示:元字符“*”表示0次、1次或多次匹配其前的原子,也可以使用“0,”完成同樣的匹配。同樣“+”可以使用“1,”表示,以及“?”可以使用“0,1”表示。Ø 邊界限制/this/ /匹配此字符串是否是以字符串“this”開始的,匹配成功/test$/ /匹配此字符串是否是以字符串“test”結束的,匹配成功/bisb/ /匹配此字符串中是否含有單詞“is”,因為在字符串“is”兩邊都需要有邊界/Bisb/ /查找字符串“is”時,左邊
18、不能為邊界而右邊必須有邊界,如“this”匹配成功用來限定字符串或單詞的邊界范圍,以獲得更準確的匹配結果。元字符“”(或“A”)和“$”(或“Z”)分別指字符串的開始與結束,而“b”用于描述字符串中每個單詞的前或后邊界,與之相反的元字符“B”表示非單詞邊界。例如有一個字符串“this is a test”使用的邊界限制如下所示:Ø 句號(.)/a.b/ /可以匹配在a和b之間有任意一個字符的字符串,例如axb、ayb、azb等在字符類之外,模式中的圓點可以匹配目標中的任何一個字符,包括不可打印字符。但不匹配換行符(默認情況下),相當于“n”(Unix系統)或“rn”(Windows系
19、統)。如果設定了模式修正符號“s”則圓點也會匹配換行符。處理圓點與處理音調符“”和美元符“$”是完全獨立的,唯一的聯系就是它們都涉及到換行符。如下所示:通常,可以使用“.*?”或“.+?”組合來匹配除換行符以外的任何字符串。例如,模式“/<b>.*?b</b>/”可以匹配以“<b>”標簽開始,“</b>”標簽結束的任何不包括換行符的字符串。Ø 模式選擇符()豎線字符“”用來分隔多選一模式,在正則表達式中匹配兩個或更多的選擇之一。例如,模式“LAMP|J2EE”表示可以匹配“LAMP”也可以匹配“J2EE”,因為元字符豎線“”的優先級是最
20、低的,所以并不是表示匹配“LAMP2EE”或“LAMPJ2EE”。也可以有更多的選擇,例如模式“/Linux|Apache|MySQL|PHP/”表示可以從中任意匹配一組。Ø 原子表()/apjsp/ /可以匹配asp、psp或jsp三種,從原子表中僅選擇一個原子使用原子表“”可以定義一組彼此地位平等的原子,且從原子表中僅選擇一個原子進行匹配。如下所示:/apjsp/ /可以匹配除了asp、php或jsp三種以外的字符串,如xsp、ysp或zsp等還可以使用原子表“”匹配除表內原子外的任意一個字符,通常稱為排除原子表。如下所示:/0xX0-9a-fA-F+/ /可以匹配一個簡單的十六
21、進制數,如0x2f、0X3AE或0x4aB等另外,在原子表中可以使用負號“-”連接一組按ASCII碼順序排列的原子,能夠簡化書寫。如下所示:Ø 模式單元/(very )*good/ /可以匹配good、very good、very very good或very very good等模式單元是使用元字符“()”將多個原子組成大的原子,被當作一個單元獨立使用。與數學表達式中的括號作用類似,一個模式單元中的表達式將被優先匹配。如下所示:在上面的例子中,緊接著“*”前的多個原子“very”用元字符“()”括起來被當作一個單元,所以原子“(very)”可以沒有,也可以有一個或多個。Ø
22、 后向引用/d4Wd2Wd2$/ /這是一個匹配日期的格式,如2008-08/08或2008/08-08等'/d4(W)d21d2$/ /這是一個匹配日期的格式,如2008-08-08或2008/08/08等使用元字符“( )”標記的開始和結束多個原子,不僅是一個獨立的單元,也是一個子表達式。這樣,對一個正則表達式模式或部分模式兩邊添加圓括號將導致相關匹配存儲到一個臨時緩沖區中,可以被獲取供以后使用。所捕獲的每個子匹配都按照在正則表達式模式中從左至右所遇到的內容存儲。存儲子匹配的緩沖區編號從1開始,連續編號直至最大99個子表達式。每個緩沖區都可以使用“n”訪問,其中n為一個標識特定緩沖
23、區的一位或兩位十進制數。例如“1”、“2”、“3”等的形式進行引用,在正則表達的模式中使用時還需要在前面再加上一個反斜線,將斜線再次轉義。例如“1”、“2”、“3”等。如下所示:在上例中聲明了兩個正則表達式,用來匹配日期格式。如果使用第一種模式則在年、月及日之間的分隔符號可以是任意的特殊字符,完全可以不對應。但實際應用中日期格式之間的分隔符號必須是對應的,即年和月之間使用“-”,則月和日之間也要和前面的一樣使用“-”。在上述中的第二個正則表達式就可以達到這種效果。這是因為模式“W”加上了元字符括號“()”,結果已經被存儲到緩沖區中。所以在第一個“(W)”的位置使用“-”則下一個位置使用“1”引
24、用時,其匹配模式也必須是字符“-”。/(Windows)(Linux)2OS/ /使用“2”再次引用第二個緩沖區中的字符串“Linux”/(?:Widows)(Linux)1OS/ /使用“?:”忽略了第一個子表式的存儲,所以“1”引用的就是“Linux”如需要使用模式單元而又不想存儲匹配結果時,可以使用非捕獲元字符 “?:”、“?=”或“?!'”來忽略對相關匹配的保存。在一些正則表達式中,使用非存儲模式單元是必要的,可以改變其后向引用的順序。如下所示:Ø 模式匹配的優先級在使用正則表達式時,需要注意匹配的順序。通常相同優先級是從左到右進行運算,不同優先級的運算先高后低。各種
25、操作符的匹配順序優先級從高到低如表4所示:表4 模式匹配的順序順 序元字符描 述1轉義符號2()、(?:)、(?=),、模式單元和原子表3*、+、?、n、n,、n,m重復匹配4、$、b、B、A、Z邊界限制5|模式選擇Ø 模式修正符模式修正符號在正則表達式定界符之外使用(最后一個反斜線“/”之后),例如“/php/i”。其中“/php/”是一個正則表達式的模式,而“i”就是修正此模式所使用的修正符號,用來在匹配時不區分大小寫。模式修正符可以調整正則表達式的解釋,擴展了正則表達式在匹配、替換等操作時的某些功能,而且模式修正符號也可以組合使用,更增強了正則表達式的處理能力。例如“/php/Uis”則是使用“U”、“i”和“s”三個模式修正符組合在一起使用。模式修正符對編寫簡潔而簡小的表達式大有幫助,在下面的表格中,列出了一些常用的模式修正符及其功能說明。如表5所示:表5 模式修正符號模式修正符功能描述i在和模式進行匹配時不區分大小寫m將字符串視為多行。默認的正則開始“”和結束“$”將目標字符串作為單一的一“行”字符(甚至其中包含有換行符也是如此)。如果在修飾符中加上“m”,那么開始和結束將會指字符串的每一行,每一行的開頭就是“”,結尾就是“$”。s如果設定了此修正符,模式中的圓點元
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年智能制造技術培訓考試試題及答案
- 2025年生物技術專業研究生入學考試試題及答案
- 2025年健康科學與營養管理考試試題及答案
- 2025年聲樂藝術考級考試題及答案
- 2025企業人事管理資料范本高管離職競業禁止合同
- 拆遷補償置換協議書
- 關于涵洞施工方案
- 手寫車禍賠償協議書
- 無證船舶上岸協議書
- 檢測單位合同協議書
- 2025四川巴中市國有資本運營集團有限公司招聘17人筆試參考題庫附帶答案詳解
- 二年級古詩詞大賽選擇題
- 急診心電圖課件
- 心臟超聲切面示意
- 保護個人隱私版課件
- pyramid之架構與應用
- 七年級期中考試后家長會課件39820
- 劍9閱讀真題原文1-William-Henry-Perkin
- 煤礦供電系統簡介
- 最新氧氣安全標簽
- 1100集裝箱船體建造工藝指導書
評論
0/150
提交評論