1. Home
  2. Docs
  3. PHP
  4. 字串
  5. Regular Expressions 正則表達式

Regular Expressions 正則表達式

正則表達式無非就是字符本身的序列或模式。它們為模式對應功能提供了基礎。

使用正則表達式,您可以在另一個字符串中搜索特定字符串,您可以用另一個字符串替換一個字符串,您可以將一個字符串分成許多塊。

PHP 提供了特定於兩組正則表達式函數的函數,每組函數對應於某種類型的正則表達式。您可以根據自己的舒適度使用它們中的任何一個。

  • POSIX 正則表達式
  • PERL 風格的正則表達式

POSIX 正則表達式

POSIX 正則表達式的結構與典型的算術表達式的結構沒有什麼不同:各種元素(運算符)組合在一起形成更複雜的表達式。

最簡單的正則表達式是在g,haggle或bag等字符串內對應單個字符(例如g)的正則表達式。

讓我們解釋一下 POSIX 正則表達式中使用的幾個概念。之後我們將向您介紹正則表達式相關的功能。

括號

括號 ([]) 在正則表達式的上下文中使用時具有特殊含義。它們用於查找一系列字符。

序號 表達與說明
1 [0-9]

它對應從 0 到 9 的任何十進制數字。

2 [az]

它對應從小寫 a 到小寫 z 的任何字符。

3 [AZ]

它對應從大寫 A 到大寫 Z 的任何字符。

4 [aZ]

它對應從小寫 a 到大寫 Z 的任何字符。

上面顯示的範圍是一般的;您還可以使用範圍 [0-3] 來對應範圍從 0 到 3 的任何十進制數字,或使用範圍 [bv] 來對應範圍從 b 到 v 的任何小寫字符。

量詞

括號內的字符序列和單個字符的頻率或位置可以用特殊字符表示。每個特殊字符都有特定的內涵。+,*,?,{int。range} 和 $ 標誌都遵循一個字符序列。

序號 表達與說明
1 p+

它對應任何包含至少一個 p 的字符串。

2 p*

它對應任何包含零個或多個 p 的字符串。

3 p?

它對應任何包含零個或一個 p 的字符串。

4 p{ N }

它對應任何包含N p序列的字符串

5 p{2,3}

它對應任何包含兩個或三個 p 序列的字符串。

6 p{2, }

它對應任何包含至少兩個 p 的序列的字符串。

7 p$

它對應任何以 p 結尾的字符串。

8 ^ p

它對應任何以 p 開頭的字符串。

例子

以下示例將清除您有關對應字符的概念。

序號 表達與說明
1 [^a-zA-Z]

它對應任何不包含從 a 到 z 和 A 到 Z 的任何字符的字符串。

2 pp

它對應任何包含 p 的字符串,後跟任何字符,依次後跟另一個 p。

3 ^.{2}$

它對應任何恰好包含兩個字符的字符串。

4 <b>(.*)</b>

它對應包含在 <b> 和 </b> 中的任何字符串。

5 p(hp)*

它對應任何包含ap的字符串,後跟零個或多個php序列實例。

預定義的字符範圍

為了您的編程方便,可以使用幾個預定義的字符範圍,也稱為字符類。字符類指定整個字符範圍,例如,字母表或整數集 –

序號 表達與說明
1 [[:α:]]

它對應任何包含字母字符 aA 到 zZ 的字符串。

2 [[:數字:]]

它對應任何包含數字 0 到 9 的字符串。

3 [[:alnum:]]

它對應任何包含字母數字字符 aA 到 zZ 和 0 到 9 的字符串。

4 [[:space:]]

它對應任何包含空格的字符串。

PHP 的 Regexp POSIX 函數

PHP 目前提供了七個使用 POSIX 風格的正則表達式搜索字符串的函數 –

序號 功能說明
1 ereg() 函數在 string 指定的字符串中搜索由 pattern 指定的字符串,如果找到模式則返回 true,否則返回 false。
2 ereg_replace() 函數搜索由pattern 指定的字符串,如果找到則用replacement 替換pattern。
3 eregi() 函數在 pattern 指定的字符串中搜索 string 指定的字符串。搜索不區分大小寫。
4 eregi_replace() 函數的操作與 ereg_replace() 完全一樣,不同之處在於在字符串中搜索模式不區分大小寫。
5 split() 函數將一個字符串分成不同的元素,每個元素的邊界基於字符串中模式的出現。
6 spliti() 函數的操作方式與其兄弟 split() 完全相同,只是它不區分大小寫。
7 sql_regcase() 函數可以被認為是一個實用函數,將輸入參數字符串中的每個字符轉換為包含兩個字符的括號表達式。

PERL 風格的正則表達式

Perl 樣式的正則表達式類似於它們的 POSIX 對應項。POSIX 語法幾乎可以與 Perl 風格的正則表達式函數互換使用。實際上,您可以使用前面 POSIX 部分中介紹的任何量詞。

讓我們解釋一下 PERL 正則表達式中使用的幾個概念。之後我們將為您介紹正則表達式相關的功能。

元字符

元字符只是一個字母字符,前面有一個反斜杠,用於賦予組合特殊的含義。

例如,您可以使用 ‘\d’ 元字符搜索大筆金額:/([\d]+)000/,這裡\d將搜索任何數字字符字符串。

以下是可以在 PERL 樣式正則表達式中使用的元字符列表。

Character		Description
. 單個字符
\s 一個空白字符(空格、製表符、換行符)
\S 非空白字符
\d 一個數字 (0-9)
\D 一個非數字
\ w一個字元(a-z,A-Z,0-9,_)
\W 一個非單詞字符
[aeiou] 對應給定集合中的單個字符
[^aeiou] 對應給定集合之外的單個字符
(foo|bar|baz) 對應任何指定的替代方案

修飾符

有幾個修飾符可以讓您更輕鬆地使用正則表達式,例如區分大小寫、多行搜索等。

修飾符說明
i 使對應不區分大小寫
m 指定字符串是否有換行符或回車符
 返回字符,^ 和 $ 運算符現在將
 對應換行邊界,而不是
 字符串邊界
o 只計算表達式一次
s 允許使用 . 對應換行符
x 允許您在表達式中使用空格以保持清晰
g 全局查找所有對應項
cg 允許在全局對應失敗後繼續搜索

PHP 的 Regexp PERL 兼容函數

PHP 提供以下使用 Perl 兼容的正則表達式搜索字符串的功能 –

序號 功能說明
1 preg_match() 函數在字符串中搜索模式,如果模式存在則返回真,否則返回假。
2 preg_match_all() 函數對應字符串中所有出現的模式。
3 preg_replace() 函數的操作與 ereg_replace() 類似,不同之處在於正則表達式可用於模式和替換輸入參數。
4 preg_split() 函數的操作與 split() 完全一樣,只是正則表達式被接受為模式的輸入參數。
5 preg_grep() 函數搜索 input_array 的所有元素,返回與正則表達式模式對應的所有元素。
6 preg_quote()引用正則表達式字符

對應該字符,則應轉義以下內容

\^。 $ | ( ) [ ]
* + ? { } ,

特殊字符定義
\ 引用下一個元字符
^ 對應行首
.對應任何字符(換行符除外)
$對應行尾(或行尾換行之前)
|交替
() 分組
[] 字符類
* 對應 0 次或多次
+ 對應 1 次或多次
?對應 1 次或 0 次
{n} 正好對應 n 次
{n,} 至少對應 n 次
{n,m} 對應至少 n 但不超過 m 次
更多特殊角色的東西
\t 製表符 (HT, TAB)
\n 換行符 (LF, NL)
\ r返回(CR)
\f 換頁 (FF)
\a 鬧鐘 (bell) (BEL)
\e 轉義(想想 troff)(ESC)
\033 八進製字符(想想 PDP-11)
\x1B 十六進製字符
\c[ 控製字符
\l 小寫下一個字符(想想 vi)
\u 大寫下一個字符(想想 vi)
\L 小寫直到 \E(想想 vi)
\U 大寫直到 \E(想想 vi)
\E 結束案例修改(想想 vi)
\ Q引用(禁用)模式元字符,直到\ E
甚至更多特殊字符
\w 對應一個“單詞”字符(字母數字加“_”)
\W 對應一個非單詞字符
\s 對應一個空白字符
\S 對應一個非空白字符
\d 對應一個數字字符
\D 對應一個非數字字符
\b 對應單詞邊界
\B 對應一個非(詞邊界)
\A 僅在字符串開頭對應
\Z 只對應字符串的結尾,或者結尾的換行符之前
\z 只在字符串末尾對應
\G 僅對應前一個 m//g 停止的地方(僅適用於 /g)