您好,登錄后才能下訂單哦!
這篇文章主要介紹了php正則表達式指的是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇php正則表達式指的是什么文章都會有所收獲,下面我們一起來看看吧。
在php中,正則表達式是描述字符排列模式的一種自定義語法規則,自身具有一套非常完整的、可以編寫模式的語法體系,提供了一種靈活且直觀的字符串處理方法。正則表達式描述的是一種字符串匹配模式,可以用來檢查一個字符串中是否含有某種子串、將匹配的子串做替換或者從某個字符串中取出符合某個條件的子串等等。
什么是正則表達式
正則表達式也稱為模式表達式,自身具有一套非常完整的、可以編寫模式的語法體系,提供了一種靈活且直觀的字符串處理方法。正則表達式通過構建具有特定規則的模式,與輸入的字符串信息比較,在特定的函數中使用從而實現字符串的匹配、查找、替換及分割等操作。
舉個我們在日常生活中的例子,如果想搜索電腦某個目錄下的所有 txt 格式的文件,就可以在該目錄下輸入*.txt,然后按回車鍵,就可以列出目錄下的所有 txt 格式的文件了。這里使用到的*.txt就可以理解為一個簡單的正則表達式。
下面使用正則表達式的語法構建了兩個例子,如下所示:
/http(s)?:\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is // 匹配網址 URL 的正則表達式
/^\w{3,}@([a-z]{2,7}|[0-9]{3})\.(com|cn)$/ // 匹配郵箱地址的正則表達式
不要被上例中看似亂碼的字符串給嚇退,它們就是按照正則表達式的語法規則構建的,是一種由普通字符和具有特殊功能的字符組成的字符串。而且要將這些字符串放在特定的正則表達式函數中使用才有效果。
正則表達式的用途
正則表達式描述的是一種字符串匹配模式,可以用來檢查一個字符串中是否含有某種子串、將匹配的子串做替換或者從某個字符串中取出符合某個條件的子串等等。例如,當用戶提交一個表單后,要判斷輸入的電話號碼、E-mail 地址等是否有效,用普通的基于字面的字符驗證顯然是不夠的。
正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為“元字符”)組成的文字模式。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。正則表達式的模式可以是單個的字符、字符集合、字符范圍、字符間的選擇或者所有這些組件的任意組合。
使用正則表達式的目的就是可以通過簡單的辦法來實現強大的功能。為了簡單、有效而又不失強大,造成了正則表達式規則的復雜,構建正確、有效的正則表達式更是難度較大,所以需要付出一些努力才行。入門之后通過一定的參考和大量實踐,在開發實踐中使用正則表達式還是比較有效且有趣的。
正則表達式中的常用術語
在學習正則表達式之前,先來了解一下正則表達式中幾個容易混淆的術語,這對于學習正則表達式有很大的幫助。
1) grep
最初是 ED 編輯器中的一條命令,用來顯示文件中特定的內容。后來成為一個獨立的工具 grep。
2) egrep
grep 雖然不斷地更新升級,但仍然無法跟上技術的腳步。為此,貝爾實驗室寫出了 egrep,意為“擴展的 grep"。這大大增強了正則表達式的能力。
3) POSIX(Portable Operating System Interface of UNIX)
可移植操作系統接口。在 grep 發展的同時,其他一些開發人員也根據自己的喜好開發出了具有獨特風格的版本。但問題也隨之而來,有的程序支持某個元字符,而有的程序則不支持。因此,就有了POSIX。POSIX 是一系列標準,確保了操作系統之間的移植性。不過 POSIX 和 SQL 一樣,沒有成為最終的標準而只能作為一個參考。
4) Perl(Practical Extraction and Reporting Language)
實際抽取與匯報語言。1987 年,Larry Wall 發布了 Perl。在隨后的 7 年時間里,從 Perl1 到現在的 Perl5,最終成為了 POSIX 之后的另一個標準。
5) PCRE
Perl 的成功,讓其他的開發人員在某種程度上要兼容"Perl",包括 C/C++、Java、Python 等都有自己的正則表達式。1997 年,Philip Hazel 開發了 PCRE 庫,這是兼容 Perl 正則表達式的一套正則引擎,其他開發人員可以將 PCRE 整合到自己的語言中,為用戶提供豐富的正則功能。許多軟件都使用 PCRE,PHP 正是其中的一員。
正則表達式語法規則
在使用正則表達式之前我們一定要先來學習正則表達式的語法。正則表達式的構成元素中一般包括普通字符、元字符、限定符、定位點、非打印字符和指定替換項等。
1) 普通字符
普通字符包括沒有顯式指定為元字符的所有可打印和不可打印字符,包括所有大小寫字母、數字、標點符號和一些符號。最簡單的正則表達式是用于搜索字符串相比較的單個普通字符。例如,單字符正則表達式/A/會始終匹配字母 A。
也可以將多個單字符組合起來形成較長的表達式,例如,正則表達式/the/會匹配搜索字符串中的 the、there、other 和 over the lazy dog 等。無須使用任何串聯運算符,只需連續輸入字符即可。
2) 元字符
除普通字符之外,正則表達式還可以包含“元字符”。元字符可分為單字符元字符和多字符元字符。例如,元字符\d,它與數字字符相匹配。
下表中列出了所有的單字符元字符。
元字符 | 行為 | 示例 |
---|---|---|
* | 零次或多次匹配前面的字符或子表達式,等效于{0,} | zo* 與 “z”和“zoo”匹配 |
+ | 一次或多次匹配前面的字符或子表達式,等效于{1,} | zo+ 與 “zo”和“zoo”匹配,但與“z”不匹配 |
? | 零次或一次匹配前面的字符或子表達式,等效于{0,1} 當 ? 緊隨任何其他限定符(*、+、?、{n}、{n,} 或 {n,m})之后時,匹配模式是非貪婪的。非貪婪模式匹配搜索到的、盡可能少的字符串,而默認的貪婪模式匹配搜索到的、盡可能多的字符串 | zo? 與“z”和“zo”匹配,但與“zoo”不匹配 o+? 只與“oooo”中的單個“o”匹配,而 o+ 與所有“o”匹配 do(es)? 與“do”或“does”中的“do”匹配 |
^ | 匹配搜索字符串開始的位置。如果標志中包括 m(多行搜索)字符,^ 還將匹配 \n 或 \r 后面的位置。如果將 ^ 用作括號表達式中的第一個字符,就會對字符集取反 | ^\d{3} 與搜索字符串開始處的 3 個字符匹配 [^abc] 與除 a、b、c 以外的任何字符匹配 |
$ | 匹配搜索字符串結束的位置。如果標志中包括 m(多行搜索)字符,^ 還將匹配 \n 或 \r 前面的位置。 | \d{3}$ 與搜索字符串結尾處的 3 個數字匹配 |
. | 匹配除換行符 \n 之外的任何單個字符。若要匹配包括 \n 在內的任意字符,請使用諸如 [\s\S] 之類的模式 | a.c 與 “abc”“a1c”和“a-c”匹配 |
[] | 標記括號表達式的開始和結尾 | [1-4] 與“1”、“2”、“3”或“4”匹配 [^aAeEiIoOuU] 與任何非元音字符匹配 |
{} | 標記限定符表達式的開始和結尾 | a{2,3} 與“aa”和“aaa”匹配 |
() | 標記子表達式的開始和結尾,可以保存子表達式,以備將來之用 | A(\d) 與“A0”至“A9”匹配。保存該數字以備將來之用 |
| | 指示兩個或多個項之間進行選擇 | z|food 與“z”或“food”匹配 (z|f)ood 與 “zood”或“food”匹配 |
/ | 表示 JavaScript 中的文本正則表達式模式的開始和結尾。在第二個 “/”后添加單字符標志可以指定搜索行為 | /abc/gi 是與 “abc”匹配的 JavaScript 文本正則表達式。g(全局)標志指定查找模式的所有匹配項,i(忽略大小寫)標志使搜索不區分大小寫 |
\ | 將下一字符標記為特殊字符、文本、反向引用或八進制轉義符 | \n 與換行符匹配。\( 與 “(”匹配。\\ 與 “\”匹配 |
這些特殊字符在括號表達式內出現時就會失去它們的意義,變成普通字符。若要匹配這些特殊字符,必須首先轉義字符,即在字符前面加反斜杠\。例如,若要搜索+文本字符,則可使用表達式\+。
除了以上單字符元字符外,還有一些多字符元字符,如下表所示。
元字符 | 行為 | 示例 |
---|---|---|
\b | 與一個字邊界匹配。即字與空格間的位置 | er\b 與 “never”中的“er”匹配,但與“verb”中的“er”不匹配 |
\B | 非邊界字匹配 | er\B 與“verb”中的“er”匹配,但與“never”中的“er”不匹配 |
\d | 數字字符匹配,等效于[0-9] | 在搜索字符串“12 345”中,\d{2} 與“12”和“34”匹配。\d 與“1”,“2”、“3”、“4”和“5”匹配 |
\D | 非數字字符匹配,等效于[^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] | 字符范圍,匹配指定范圍內的任何字符 | [a-z] 與“a”到“z”范圍內的任何小寫字母字符匹配 |
[^a-z] | 反向字符范圍,與不在指定范圍內的任何字符匹配 | [^a-z] 與不在范圍“a”到“z”內的任何字符匹配 |
{n} | 正好匹配 n 次,n 是非負整數 | o{2} 與“Bob”中的“o”不匹配,但與“fooood”中的兩個“o”匹配 |
{n,} | 至少匹配 n 次,n 是非負整數 * 與 {0,} 相等 + 與 {1,} 相等 | o{2} 與“Bob”中的“o”不匹配,但與“fooood”中的所有“o”匹配 |
{n,m} | 匹配至少 n 次,至多 m 次。n 和 m 是非負整數,其中 n<= m,逗號和數字之間不能有空格 ? 與 {0,1} 相等 | 在搜索字符串“1234567”中,\d{1,3} 與“123”、“456”和“7”匹配 |
(模式) | 與模式匹配并保存匹配項。可以從由 JavaScript 中的 exec Method 返回的數組元素中檢索保存的匹配項。若要匹配括號字符(),請使用“\(”或者“\)” | (Chapter|Section) [1-9] 與 “Chapter 5”匹配,保存“Chapter”以備將來之用 |
(?:模式) | 與模式匹配,但不保存匹配項,即不會存儲匹配項以備將來之用。這對于用“or”字符(|)組合模式部件的情況很有用 | industry(?:y|ies) 與 industry|industries 相等 |
(?=模式) | 正預測先行。找到一個匹配項后,將在匹配文本之前開始搜索下一個匹配項。不會保存匹配項以備將來之用 | ^(?=_.*\d.{4,8}$ 對密碼應用一下限制: 其長度必須介于 4 到 8 字符之間,并且必須至少包含一個數字,在該模式中,*\d 查找后跟有數字的任意多個字符。對于搜索字符串“abc3qr”,與“abc3”匹配。 從該匹配項之前,(而不是之后)開始,{4,8} 與包含 4~8 個字符的字符串匹配,與“abc3qr”匹配。 ^ 和 $ 指定搜索字符串的開始和結束位置,將在搜索字符串包含匹配字符之外的任何字符時阻止匹配 |
(?!模式) | 負預測先行。匹配與模式不匹配的搜索字符串。找到一個匹配項后,將在匹配文本之前開始搜索下一個匹配項。不會保存匹配項以備將來之用 | \b(?!th)/w+\b 與不以“th”開頭的單詞匹配在該模式中,\b 與一個字邊界匹配。對于搜索字符串“quick”,與第一個空格匹配。(?!th) 與非“th”字符串匹配與“qu”匹配,從該匹配項開始,!w+ 與一個字匹配,即與“quick”匹配 |
\cx | 匹配 x 指示的控制字符。x 的值必須在 A-Z 或 a-z 范圍內。如果不是這樣,就假定 c 是文本“c”字符本身 | \cM 與 Ctrl+M 或一個回車符匹配 |
\xn | 匹配 n,此處的 n 是一個十六進制轉義碼。十六進制轉義碼必須正好是兩位數長。允許在正則表達式中使用 ASCII 代碼 | \x41 與“A”匹配、\x41 等效于后跟有“1”的“\x04”(因為 n 必須正好是兩位數) |
\num | 匹配 num,此處的 num 是一個正整數。這是對以保存的匹配項的引用 | (.)\1 與兩個連續的相同字符匹配 |
\n | 標識一個八進制轉義碼或反向引用。如果 \n 前面至少有 n 個捕獲子表達式,那么 n 是反向引用;否則,如果 n 是八進制數(0-7),那么 n 是八進制轉義碼 | (\d)\1 與兩個連續的相同數字匹配 |
\nm | 標識一個八進制轉義碼或反向引用。如果 \nm 前面至少有 nm 個捕獲子表達式,那么 nm 是反向引用。如果 \nm 前面至少有 n 個捕獲子表達式,則 n 是反向引用,后面跟有文本 m。如果上述情況都不存在,當 n 和 m 是八進制數字(0-7)時,\nm 匹配八進制轉義碼 nm | \11 與制表符匹配 |
\nml | 當 n 是八進制數字(0-3)、m 和 1 是八進制數字(0-7)時,匹配八進制轉義碼 nml | \011 與制表符匹配 |
\un | 匹配 n,其中 n 是以 4 位十進制數字表示的 Unicode 字符 | \u00A9 與版權符號(??)匹配 |
3) 非打印字符
非打印字符是由普通字符與轉義字符組成,用來在正則表達式中匹配特定行為的字符,如換行、換頁、空白符等。下表列出了非打印字符。
字符 | 匹配 | 等效于 |
---|---|---|
\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) 優先級順序
在使用正則表達式時,需要注意匹配的順序。通常相同優先級是從左到右進行運算的,不同優先級的運算先高后低。各種操作符的匹配順序優先級從高到低,如下表所示。
順序 | 元字符 | 描述 |
---|---|---|
1 | \ | 轉義符 |
2 | ( )、(?:)、(?=)、[ ] | 括號和中括號 |
3 | *、+、{n}、{n,}、{n,m} | 限定符 |
4 | ^、$、\ 任何元字符 | 定位點和序列 |
5 | | | 替換 |
另外,字符具有高于替換運算符的優先級,例如,允許 "m|food" 匹配 "m" 或 "food"。
替換
正則表達式中的替換允許對兩個或多個替換選項之間的選擇進行分組。實際上可以在模式中指定兩種匹配模式的或關系。可以使用管道|字符指定兩個或多個替換選項之間的選擇,稱之為“替換”。匹配管道字符任一側最大的表達式。
例如:
/Chapter|Section [1-9][0-9]{0,1}/
該正則表達式匹配的是字符串“Chapter”或者字符串“Section”后跟一個或兩個數字。
如果搜索字符串是“Section 22”,那么該表達式匹配“Section 22”。但是,如果搜索字符串是“Chapter 22”,那么表達式匹配單詞“Chapter”,而不是匹配“Chapter 22”。
為了解決這種形式的表達式可能帶來的誤導,可以使用括號來限制替換的范圍,即確保它只應用于兩個單詞“Chapter”和“Section”。可以通過添加括號來使正則表達式匹配“Chapter 1”或“Section 3”。將以上表達式改成如下形式:
/(Chapter|Section) [1-9][0-9]{0,1}/
修改后,如果搜索字符串是“Section 22”,那么該表達式匹配“Section 22”。如果搜索字符串是“Chapter 22”,那么表達式匹配單詞也會是“Chapter 22”。
子表達式
正則表達式中放置括號可創建子表達式,子表達式允許匹配搜索文本中的模式并將匹配項分成多個單獨的子匹配項,程序可檢索生成的子匹配項。
例如匹配郵箱賬號的正則表達式:
/(\w+)@(\w+)\.(\w+)/
該正則表達式包含 3 個子表達式,3 個子表達式分別進行匹配并保留匹配結果,與其他表達式匹配結果作為一個整體顯示出來。
下面的示例將通用資源指示符(URI)分解為其組件:
/(\w+):\/\/([^\/:]+)(:\d*)?([^# ]*)/
第一個括號子表達式保存 Web 地址的協議部分,匹配在冒號和兩個正斜杠前面的任何單詞。
第二個括號子表達式保存地址的域地址部分,匹配不包括左斜線/或冒號:字符的任何字符序列。
第三個括號子表達式保存網站端口號(如果指定了的話),匹配冒號后面的零個或多個數字。
第四個括號子表達式保存 Web 地址指定的路徑和/或頁信息,匹配零個或多個數字字符#或空白字符之外的字符。
如果我們使用這個正則表達式匹配字符串“http://msdn.microsoft.com:80/scripting/default.htm”,那么 3 個子表達式的匹配結果分別為 http、msdn.microsoft.com:80、/scripting/default.htm。
反向引用
反向引用用于查找重復字符組。此外,可使用反向引用來重新排列輸入字符串中各個元素的順序和位置,以重新設置輸入字符串的格式。
可以從正則表達式和替換字符串中引用子表達式。每個子表達式都由一個編號來標識,并稱作反向引用。
在正則表達式中,每個保存的子匹配項按照它們從左到右出現的順序存儲。用于存儲子匹配項的緩沖區編號從 1 開始,最多可存儲 99 個子表達式。在正則表達式中,可以使用 \n 來訪問每個緩沖區,其中 n 標識特定緩沖區的一位或兩位十進制數字。
反向引用的一個應用是,提供查找文本中兩個相同單詞的匹配項的能力。以下面的句子為例:
Is is the cost of of gasoline going up up?
該句子包含多個重復的單詞。如果能設計一種方法定位該句子,而不必查找每個單詞的重復出現,就會很有用。
下面的正則表達式使用單個子表達式來實現這一點:
/\b([a-z]+) \1\b/
在此情況下,子表達式是括在括號中的所有內容。該子表達式包括由 [a-z]+ 指定的一個或多個字母字符。正則表達式的第二部分是對以前保存的子匹配項的引用,即單詞的第二個匹配項正好由括號表達式匹配。\1 用于指定第一個子匹配項。\b 單詞邊界元字符確保只檢測單獨的單詞。否則,諸如“is issued”或“this is”之類的詞組將不能正確地被此表達式識別。所以,使用表達式 /\b([a-z]+)\1\b/ 匹配字符串“Is is the cost of of gasoline going up up?”得到的結果為 is、of、up。
在 PHP 中使用正則表達式
PHP 有兩套函數庫支持的正則表達式處理操作:
一套是由 PCRE(Perl Compatible Regular Expression)庫提供、與 Perl 語言兼容的正則表達式函數,以preg_為函數的前綴名稱;
另一套是 POSIX(Portable Operating System Interface)擴展語法正則表達式函數,以ereg_為函數的前綴。
兩套函數庫的功能相似,但是 PCRE 的執行效率高于 POSIX,所以我們只介紹 PCRE 函數庫。
關于“php正則表達式指的是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“php正則表達式指的是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。