日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
PHP正則表達(dá)式,看這一篇就夠了
可能大家之前聽說過正則表達(dá)式,大概的印象是很難學(xué)、很復(fù)雜,有種深不可測的感覺。其實正則表達(dá)式?jīng)]有那么神秘,它是描述字符排列模式的一種自定義語法規(guī)則。許多語言,比如 PERL、php、Python、JavaScript 等都支持使用正則表達(dá)式。

本節(jié)就帶領(lǐng)大家來了解一下正則表達(dá)式。

什么是正則表達(dá)式

正則表達(dá)式也稱為模式表達(dá)式,自身具有一套非常完整的、可以編寫模式的語法體系,提供了一種靈活且直觀的字符串處理方法。正則表達(dá)式通過構(gòu)建具有特定規(guī)則的模式,與輸入的字符串信息比較,在特定的函數(shù)中使用從而實現(xiàn)字符串的匹配、查找、替換及分割等操作。

舉個我們在日常生活中的例子,如果想搜索電腦某個目錄下的所有 txt 格式的文件,就可以在該目錄下輸入
*.txt,然后按回車鍵,就可以列出目錄下的所有 txt 格式的文件了。這里使用到的
*.txt 就可以理解為一個簡單的正則表達(dá)式。

下面使用正則表達(dá)式的語法構(gòu)建了兩個例子,如下所示:

/http(s)?:\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is      // 匹配網(wǎng)址 URL 的正則表達(dá)式
/^\w{3,}@([a-z]{2,7}|[0-9]{3})\.(com|cn)$/                    // 匹配郵箱地址的正則表達(dá)式

不要被上例中看似亂碼的字符串給嚇退,它們就是按照正則表達(dá)式的語法規(guī)則構(gòu)建的,是一種由普通字符和具有特殊功能的字符組成的字符串。而且要將這些字符串放在特定的正則表達(dá)式函數(shù)中使用才有效果。

正則表達(dá)式的用途

正則表達(dá)式描述的是一種字符串匹配模式,可以用來檢查一個字符串中是否含有某種子串、將匹配的子串做替換或者從某個字符串中取出符合某個條件的子串等等。例如,當(dāng)用戶提交一個表單后,要判斷輸入的電話號碼、E-mail 地址等是否有效,用普通的基于字面的字符驗證顯然是不夠的。

正則表達(dá)式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為“元字符”)組成的文字模式。正則表達(dá)式作為一個模板,將某個字符模式與所搜索的字符串進(jìn)行匹配。正則表達(dá)式的模式可以是單個的字符、字符集合、字符范圍、字符間的選擇或者所有這些組件的任意組合。

使用正則表達(dá)式的目的就是可以通過簡單的辦法來實現(xiàn)強(qiáng)大的功能。為了簡單、有效而又不失強(qiáng)大,造成了正則表達(dá)式規(guī)則的復(fù)雜,構(gòu)建正確、有效的正則表達(dá)式更是難度較大,所以需要付出一些努力才行。入門之后通過一定的參考和大量實踐,在開發(fā)實踐中使用正則表達(dá)式還是比較有效且有趣的。

正則表達(dá)式中的常用術(shù)語

在學(xué)習(xí)正則表達(dá)式之前,先來了解一下正則表達(dá)式中幾個容易混淆的術(shù)語,這對于學(xué)習(xí)正則表達(dá)式有很大的幫助。

1) grep

最初是 ED 編輯器中的一條命令,用來顯示文件中特定的內(nèi)容。后來成為一個獨立的工具 grep。

2) egrep

grep 雖然不斷地更新升級,但仍然無法跟上技術(shù)的腳步。為此,貝爾實驗室寫出了 egrep,意為“擴(kuò)展的 grep"。這大大增強(qiáng)了正則表達(dá)式的能力。

3) POSIX(Portable Operating System Interface of UNIX)

可移植操作系統(tǒng)接口。在 grep 發(fā)展的同時,其他一些開發(fā)人員也根據(jù)自己的喜好開發(fā)出了具有獨特風(fēng)格的版本。但問題也隨之而來,有的程序支持某個元字符,而有的程序則不支持。因此,就有了POSIX。POSIX 是一系列標(biāo)準(zhǔn),確保了操作系統(tǒng)之間的移植性。不過 POSIX 和 SQL 一樣,沒有成為最終的標(biāo)準(zhǔn)而只能作為一個參考。

4) Perl(Practical Extraction and Reporting Language)

實際抽取與匯報語言。1987 年,Larry Wall 發(fā)布了 Perl。在隨后的 7 年時間里,從 Perl1 到現(xiàn)在的 Perl5,最終成為了 POSIX 之后的另一個標(biāo)準(zhǔn)。

5) PCRE

Perl 的成功,讓其他的開發(fā)人員在某種程度上要兼容"Perl",包括 C/C++、Java、Python 等都有自己的正則表達(dá)式。1997 年,Philip Hazel 開發(fā)了 PCRE 庫,這是兼容 Perl 正則表達(dá)式的一套正則引擎,其他開發(fā)人員可以將 PCRE 整合到自己的語言中,為用戶提供豐富的正則功能。許多軟件都使用 PCRE,PHP 正是其中的一員。

正則表達(dá)式語法規(guī)則

在使用正則表達(dá)式之前我們一定要先來學(xué)習(xí)正則表達(dá)式的語法。正則表達(dá)式的構(gòu)成元素中一般包括普通字符、元字符、限定符、定位點、非打印字符和指定替換項等。

1) 普通字符

普通字符包括沒有顯式指定為元字符的所有可打印和不可打印字符,包括所有大小寫字母、數(shù)字、標(biāo)點符號和一些符號。最簡單的正則表達(dá)式是用于搜索字符串相比較的單個普通字符。例如,單字符正則表達(dá)式
/A/會始終匹配字母 A。

也可以將多個單字符組合起來形成較長的表達(dá)式,例如,正則表達(dá)式
/the/會匹配搜索字符串中的 the、there、other 和 over the lazy dog 等。無須使用任何串聯(lián)運算符,只需連續(xù)輸入字符即可。

2) 元字符

除普通字符之外,正則表達(dá)式還可以包含“元字符”。元字符可分為單字符元字符和多字符元字符。例如,元字符
\d,它與數(shù)字字符相匹配。

下表中列出了所有的單字符元字符。

元字符 行為 示例
* 零次或多次匹配前面的字符或子表達(dá)式,等效于{0,} zo* 與 “z”和“zoo”匹配
+ 一次或多次匹配前面的字符或子表達(dá)式,等效于{1,} zo+ 與 “zo”和“zoo”匹配,但與“z”不匹配
? 零次或一次匹配前面的字符或子表達(dá)式,等效于{0,1}
當(dāng) ? 緊隨任何其他限定符(*、+、?、{n}、{n,} 或 {n,m})之后時,匹配模式是非貪婪的。非貪婪模式匹配搜索到的、盡可能少的字符串,而默認(rèn)的貪婪模式匹配搜索到的、盡可能多的字符串
zo? 與“z”和“zo”匹配,但與“zoo”不匹配
o+? 只與“oooo”中的單個“o”匹配,而 o+ 與所有“o”匹配
do(es)? 與“do”或“does”中的“do”匹配
^ 匹配搜索字符串開始的位置。如果標(biāo)志中包括 m(多行搜索)字符,^ 還將匹配 \n 或 \r 后面的位置。如果將 ^ 用作括號表達(dá)式中的第一個字符,就會對字符集取反 ^\d{3} 與搜索字符串開始處的 3 個字符匹配
[^abc] 與除 a、b、c 以外的任何字符匹配
$ 匹配搜索字符串結(jié)束的位置。如果標(biāo)志中包括 m(多行搜索)字符,^ 還將匹配 \n 或 \r 前面的位置。 \d{3}$ 與搜索字符串結(jié)尾處的 3 個數(shù)字匹配
. 匹配除換行符 \n 之外的任何單個字符。若要匹配包括 \n 在內(nèi)的任意字符,請使用諸如 [\s\S] 之類的模式 a.c 與 “abc”“a1c”和“a-c”匹配
[] 標(biāo)記括號表達(dá)式的開始和結(jié)尾 [1-4] 與“1”、“2”、“3”或“4”匹配
[^aAeEiIoOuU] 與任何非元音字符匹配
{} 標(biāo)記限定符表達(dá)式的開始和結(jié)尾 a{2,3} 與“aa”和“aaa”匹配
() 標(biāo)記子表達(dá)式的開始和結(jié)尾,可以保存子表達(dá)式,以備將來之用 A(\d) 與“A0”至“A9”匹配。保存該數(shù)字以備將來之用
| 指示兩個或多個項之間進(jìn)行選擇 z|food 與“z”或“food”匹配
(z|f)ood 與 “zood”或“food”匹配
/ 表示 JavaScript 中的文本正則表達(dá)式模式的開始和結(jié)尾。在第二個 “/”后添加單字符標(biāo)志可以指定搜索行為 /abc/gi 是與 “abc”匹配的 JavaScript 文本正則表達(dá)式。g(全局)標(biāo)志指定查找模式的所有匹配項,i(忽略大小寫)標(biāo)志使搜索不區(qū)分大小寫
\ 將下一字符標(biāo)記為特殊字符、文本、反向引用或八進(jìn)制轉(zhuǎn)義符 \n 與換行符匹配。\( 與 “(”匹配。\\ 與 “\”匹配

這些特殊字符在括號表達(dá)式內(nèi)出現(xiàn)時就會失去它們的意義,變成普通字符。若要匹配這些特殊字符,必須首先轉(zhuǎn)義字符,即在字符前面加反斜杠
\。例如,若要搜索
+文本字符,則可使用表達(dá)式
\+。

除了以上單字符元字符外,還有一些多字符元字符,如下表所示。

元字符 行為 示例
\b 與一個字邊界匹配。即字與空格間的位置 er\b 與 “never”中的“er”匹配,但與“verb”中的“er”不匹配
\B 非邊界字匹配 er\B 與“verb”中的“er”匹配,但與“never”中的“er”不匹配
\d 數(shù)字字符匹配,等效于[0-9] 在搜索字符串“12 345”中,\d{2} 與“12”和“34”匹配。\d 與“1”,“2”、“3”、“4”和“5”匹配
\D 非數(shù)字字符匹配,等效于[^0-9] /D+ 與“abc123 def”中的“abc”和“def”匹配
\w 與 A-Z、a-z、0-9 和下劃線中的任意任意字符匹配,等效于[A-Za-z0-9] 在搜索字符串“The quick brown fox...”中,\w+ 與“The”、“quick”、“brown”和“fox”匹配
\W 與除 A-Z、a-z、0-9 和下劃線以外的任意字符匹配,等效于[^A-Za-z0-9] 在搜索字符串“The quick brown fox...”中,\W+ 與“...”和所有空格匹配
[xyz] 字符集,與任何一個指定字符匹配 [abc] 和 “plain”中的“a”匹配
[^xyz] 反向字符集,與未指定的任何字符匹配 [^abc] 與“plain”中的“p”、“1”、“i”和“n”匹配
[a-z] 字符范圍,匹配指定范圍內(nèi)的任何字符 [a-z] 與“a”到“z”范圍內(nèi)的任何小寫字母字符匹配
[^a-z] 反向字符范圍,與不在指定范圍內(nèi)的任何字符匹配 [^a-z] 與不在范圍“a”到“z”內(nèi)的任何字符匹配
{n} 正好匹配 n 次,n 是非負(fù)整數(shù) o{2} 與“Bob”中的“o”不匹配,但與“fooood”中的兩個“o”匹配
{n,} 至少匹配 n 次,n 是非負(fù)整數(shù)
* 與 {0,} 相等
+ 與 {1,} 相等
o{2} 與“Bob”中的“o”不匹配,但與“fooood”中的所有“o”匹配
{n,m} 匹配至少 n 次,至多 m 次。n 和 m 是非負(fù)整數(shù),其中 n<= m,逗號和數(shù)字之間不能有空格
? 與 {0,1} 相等
在搜索字符串“1234567”中,\d{1,3} 與“123”、“456”和“7”匹配
(模式) 與模式匹配并保存匹配項??梢詮挠?JavaScript 中的 exec Method 返回的數(shù)組元素中檢索保存的匹配項。若要匹配括號字符(),請使用“\(”或者“\)” (Chapter|Section) [1-9] 與 “Chapter 5”匹配,保存“Chapter”以備將來之用
(?:模式) 與模式匹配,但不保存匹配項,即不會存儲匹配項以備將來之用。這對于用“or”字符(|)組合模式部件的情況很有用 industry(?:y|ies) 與 industry|industries 相等
(?=模式) 正預(yù)測先行。找到一個匹配項后,將在匹配文本之前開始搜索下一個匹配項。不會保存匹配項以備將來之用 ^(?=_.*\d.{4,8}$ 對密碼應(yīng)用一下限制:
其長度必須介于 4 到 8 字符之間,并且必須至少包含一個數(shù)字,在該模式中,*\d 查找后跟有數(shù)字的任意多個字符。對于搜索字符串“abc3qr”,與“abc3”匹配。
從該匹配項之前,(而不是之后)開始,{4,8} 與包含 4~8 個字符的字符串匹配,與“abc3qr”匹配。
^ 和 $ 指定搜索字符串的開始和結(jié)束位置,將在搜索字符串包含匹配字符之外的任何字符時阻止匹配
(?!模式) 負(fù)預(yù)測先行。匹配與模式不匹配的搜索字符串。找到一個匹配項后,將在匹配文本之前開始搜索下一個匹配項。不會保存匹配項以備將來之用 \b(?!th)/w+\b 與不以“th”開頭的單詞匹配在該模式中,\b 與一個字邊界匹配。對于搜索字符串“quick”,與第一個空格匹配。(?!th) 與非“th”字符串匹配與“qu”匹配,從該匹配項開始,!w+ 與一個字匹配,即與“quick”匹配
\cx 匹配 x 指示的控制字符。x 的值必須在 A-Z 或 a-z 范圍內(nèi)。如果不是這樣,就假定 c 是文本“c”字符本身 \cM 與 Ctrl+M 或一個回車符匹配
\xn 匹配 n,此處的 n 是一個十六進(jìn)制轉(zhuǎn)義碼。十六進(jìn)制轉(zhuǎn)義碼必須正好是兩位數(shù)長。允許在正則表達(dá)式中使用 ASCII 代碼 \x41 與“A”匹配、\x41 等效于后跟有“1”的“\x04”(因為 n 必須正好是兩位數(shù))
\num 匹配 num,此處的 num 是一個正整數(shù)。這是對以保存的匹配項的引用 (.)\1 與兩個連續(xù)的相同字符匹配
\n 標(biāo)識一個八進(jìn)制轉(zhuǎn)義碼或反向引用。如果 \n 前面至少有 n 個捕獲子表達(dá)式,那么 n 是反向引用;否則,如果 n 是八進(jìn)制數(shù)(0-7),那么 n 是八進(jìn)制轉(zhuǎn)義碼 (\d)\1 與兩個連續(xù)的相同數(shù)字匹配
\nm 標(biāo)識一個八進(jìn)制轉(zhuǎn)義碼或反向引用。如果 \nm 前面至少有 nm 個捕獲子表達(dá)式,那么 nm 是反向引用。如果 \nm 前面至少有 n 個捕獲子表達(dá)式,則 n 是反向引用,后面跟有文本 m。如果上述情況都不存在,當(dāng) n 和 m 是八進(jìn)制數(shù)字(0-7)時,\nm 匹配八進(jìn)制轉(zhuǎn)義碼 nm \11 與制表符匹配
\nml 當(dāng) n 是八進(jìn)制數(shù)字(0-3)、m 和 1 是八進(jìn)制數(shù)字(0-7)時,匹配八進(jìn)制轉(zhuǎn)義碼 nml \011 與制表符匹配
\un 匹配 n,其中 n 是以 4 位十進(jìn)制數(shù)字表示的 Unicode 字符 \u00A9 與版權(quán)符號(??)匹配

3) 非打印字符

非打印字符是由普通字符與轉(zhuǎn)義字符組成,用來在正則表達(dá)式中匹配特定行為的字符,如換行、換頁、空白符等。下表列出了非打印字符。

字符 匹配 等效于
\f 換頁符 \x0c 和 \cL
\n 換行符 \x0a 和 \cJ
\r 回車符 \x0d 和 \cM
\s 任何空白字符,包括空格、制表符和換頁符 [\f\b\r\t\v]
\S 任何非空白字符 [^\f\b\r\t\v]
\t Tab 字符 \x09 和 \cI
\v 垂直制表符 \x0b 和 \cK

4) 優(yōu)先級順序

在使用正則表達(dá)式時,需要注意匹配的順序。通常相同優(yōu)先級是從左到右進(jìn)行運算的,不同優(yōu)先級的運算先高后低。各種操作符的匹配順序優(yōu)先級從高到低,如下表所示。

順序 元字符 描述
1 \ 轉(zhuǎn)義符
2 ( )、(?:)、(?=)、[ ] 括號和中括號
3 *、+、{n}、{n,}、{n,m} 限定符
4 ^、$、\ 任何元字符 定位點和序列
5 | 替換

另外,字符具有高于替換運算符的優(yōu)先級,例如,允許 "m|food" 匹配 "m" 或 "food"。

替換

正則表達(dá)式中的替換允許對兩個或多個替換選項之間的選擇進(jìn)行分組。實際上可以在模式中指定兩種匹配模式的或關(guān)系??梢允褂霉艿?br /> |字符指定兩個或多個替換選項之間的選擇,稱之為“替換”。匹配管道字符任一側(cè)最大的表達(dá)式。

例如:

/Chapter|Section [1-9][0-9]{0,1}/

該正則表達(dá)式匹配的是字符串“Chapter”或者字符串“Section”后跟一個或兩個數(shù)字。

如果搜索字符串是“Section 22”,那么該表達(dá)式匹配“Section 22”。但是,如果搜索字符串是“Chapter 22”,那么表達(dá)式匹配單詞“Chapter”,而不是匹配“Chapter 22”。

為了解決這種形式的表達(dá)式可能帶來的誤導(dǎo),可以使用括號來限制替換的范圍,即確保它只應(yīng)用于兩個單詞“Chapter”和“Section”??梢酝ㄟ^添加括號來使正則表達(dá)式匹配“Chapter 1”或“Section 3”。將以上表達(dá)式改成如下形式:

/(Chapter|Section) [1-9][0-9]{0,1}/

修改后,如果搜索字符串是“Section 22”,那么該表達(dá)式匹配“Section 22”。如果搜索字符串是“Chapter 22”,那么表達(dá)式匹配單詞也會是“Chapter 22”。

子表達(dá)式

正則表達(dá)式中放置括號可創(chuàng)建子表達(dá)式,子表達(dá)式允許匹配搜索文本中的模式并將匹配項分成多個單獨的子匹配項,程序可檢索生成的子匹配項。

例如匹配郵箱賬號的正則表達(dá)式:

/(\w+)@(\w+)\.(\w+)/

該正則表達(dá)式包含 3 個子表達(dá)式,3 個子表達(dá)式分別進(jìn)行匹配并保留匹配結(jié)果,與其他表達(dá)式匹配結(jié)果作為一個整體顯示出來。

下面的示例將通用資源指示符(URI)分解為其組件:

/(\w+):\/\/([^\/:]+)(:\d*)?([^# ]*)/

第一個括號子表達(dá)式保存 Web 地址的協(xié)議部分,匹配在冒號和兩個正斜杠前面的任何單詞。

第二個括號子表達(dá)式保存地址的域地址部分,匹配不包括左斜線
/或冒號
字符的任何字符序列。

第三個括號子表達(dá)式保存網(wǎng)站端口號(如果指定了的話),匹配冒號后面的零個或多個數(shù)字。

第四個括號子表達(dá)式保存 Web 地址指定的路徑和/或頁信息,匹配零個或多個數(shù)字字符
#或空白字符之外的字符。

如果我們使用這個正則表達(dá)式匹配字符串“http://msdn.microsoft.com:80/scripting/default.htm”,那么 3 個子表達(dá)式的匹配結(jié)果分別為 http、msdn.microsoft.com:80、/scripting/default.htm。

反向引用

反向引用用于查找重復(fù)字符組。此外,可使用反向引用來重新排列輸入字符串中各個元素的順序和位置,以重新設(shè)置輸入字符串的格式。

可以從正則表達(dá)式和替換字符串中引用子表達(dá)式。每個子表達(dá)式都由一個編號來標(biāo)識,并稱作反向引用。

在正則表達(dá)式中,每個保存的子匹配項按照它們從左到右出現(xiàn)的順序存儲。用于存儲子匹配項的緩沖區(qū)編號從 1 開始,最多可存儲 99 個子表達(dá)式。在正則表達(dá)式中,可以使用 \n 來訪問每個緩沖區(qū),其中 n 標(biāo)識特定緩沖區(qū)的一位或兩位十進(jìn)制數(shù)字。

反向引用的一個應(yīng)用是,提供查找文本中兩個相同單詞的匹配項的能力。以下面的句子為例:

Is is the cost of of gasoline going up up?

該句子包含多個重復(fù)的單詞。如果能設(shè)計一種方法定位該句子,而不必查找每個單詞的重復(fù)出現(xiàn),就會很有用。

下面的正則表達(dá)式使用單個子表達(dá)式來實現(xiàn)這一點:

/\b([a-z]+) \1\b/

在此情況下,子表達(dá)式是括在括號中的所有內(nèi)容。該子表達(dá)式包括由 [a-z]+ 指定的一個或多個字母字符。正則表達(dá)式的第二部分是對以前保存的子匹配項的引用,即單詞的第二個匹配項正好由括號表達(dá)式匹配。\1 用于指定第一個子匹配項。\b 單詞邊界元字符確保只檢測單獨的單詞。否則,諸如“is issued”或“this is”之類的詞組將不能正確地被此表達(dá)式識別。所以,使用表達(dá)式 /\b([a-z]+)\1\b/ 匹配字符串“Is is the cost of of gasoline going up up?”得到的結(jié)果為 is、of、up。

在 PHP 中使用正則表達(dá)式

PHP 有兩套函數(shù)庫支持的正則表達(dá)式處理操作:

  • 一套是由 PCRE(Perl Compatible Regular Expression)庫提供、與 Perl 語言兼容的正則表達(dá)式函數(shù),以preg_為函數(shù)的前綴名稱;
  • 另一套是 POSIX(Portable Operating System Interface)擴(kuò)展語法正則表達(dá)式函數(shù),以ereg_為函數(shù)的前綴。

兩套函數(shù)庫的功能相似,但是 PCRE 的執(zhí)行效率高于 POSIX,所以我們只介紹 PCRE 函數(shù)庫。


本文名稱:PHP正則表達(dá)式,看這一篇就夠了
URL地址:http://www.dlmjj.cn/article/djsdepe.html