當前位置:
首頁 > 最新 > 系統學習PHP之正則表達式

系統學習PHP之正則表達式

正則表達式是一個從左到右匹配目標字元串的模式。它不是PHP的專屬,如何一門成熟的語言都支持正則,可以說正則就是一門編程語言。這裡就只研究 PHP 正則的使用,先來介紹幾個PHP中使用正則的函數


PCRE函數

#1 preg_match / preg_match_all

int preg_match / preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

參數 1 :$pattern匹配模式;

參數 2 :$subject匹配源;

參數 3 :$matches存儲匹配結果;

返回值:preg_match在第一次匹配後 將會停止搜索,所以它的值將是 0 次(不匹配)或 1次preg_match_all() 會一直搜索subject 直到到達結尾。

#2 preg_replace /preg_filter

mixed preg_filter ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

在 subject 尋找與 pattern 匹配的的值並替換成 replacement,返回是替換之後的結果。 pattern 和 replacement 可以作為數組進行替換,preg_filter()等價於preg_replace(),但在處理數組替換時返回結果有所差異,preg_replace不管匹配不匹配,數組的值都進行返回,preg_filter 返回匹配的替換之後的數組preg_grep

array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )

返回給定數組 input 中與模式pattern 匹配的元素組成的數組,(閹割版的preg_filter,),只匹配,不替換。

#3 preg_split

array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )

升級版的explode函數,在 subject 尋找與 pattern 匹配的的值將其作為分割點,每一段為數組的值。

#4 preg_quote

string preg_quote ( string $str [, string $delimiter = NULL ] )

轉義正則表達式字元;


正則表達式是由普通字元(例如字元 a 到 z)以及特殊字元(稱為」元字元」)組成的文字模式。


原子是正則表達式中最小的單位,分為可見原子與不可見原子,可見原子是指Unicode編碼中用鍵盤輸出後肉眼可見的字元。

關於可見原子需要注意:

1、匹配文字時,需要將文字轉換為對應的Unicode編碼格式,否則會因編碼格式導致未知錯誤;

2、. * + ? ,所有有意義的字元,如果想作為原子使用,必須統統使用 轉義字元轉義;

不可見原子就是Unicode編碼中用鍵盤輸出後肉眼不可見的字元,例如:(
)換行符、(
)回車、( )製表符、空格等。好,下面開始正式介紹正在表達模式的語法


當使用 PCRE 函數的時候,模式需要由分隔符閉合包裹。分隔符可以使任意非字母數字、非反斜線、非空白字元。

經常使用的分隔符是正斜線(/)、hash符號(#) 以及取反符號(~);

如果分隔符需要在模式內進行匹配,它必須使用反斜線進行轉義。如果分隔符經常在 模式內出現, 一個更好的選擇就是是用其他分隔符來提高可讀性。

#1 來一些界定符的栗子:

/http:///#http://#


正則表達式的威力源於它可以在模式中擁有選擇和重複的能力。 一些字元被賦予 特殊的涵義,使其不再單純的代表自己,模式中的這種有特殊涵義的編碼字元 稱為 元字元。#1 元字元的作用之 |、[]、[^] 定義原子的篩選方式:

| 匹配兩個或多個分支選擇 如: Duang|duang, 匹配Duang或者duang, 注意Duang和duang必須是連續的;

[] 匹配方括弧中任意一個原子如: [D,d]uang, 意思是匹配Duang或者duang,[34^9]匹配3,4,^,9這4個原子,[0-9a-zA-Z]匹字母和數字,[3-6]匹配3到6之間的數字

[^] 匹配除了方括弧中的原子 如[^0-9a-zA-Z]匹配除了字母和數字的原子, 其中尖號必須緊靠左中括弧

#2 元字元的作用之定義原子的集合

. 匹配除了換行符之外的任意字元, 和[^
]等價

d 匹配任意一個十進位數字 即[0-9]

D 匹配任意一個非十進位數字 即[^0-9]

w 匹配任意一個數字, 字母或下劃線 [0-9a-zA-Z_]

W匹配人一個非數字, 字母或下劃線[^0-9a-zA-Z_]

s 匹配一個不可見的原子 即[f

v]

S匹配一個可見的原子 即[^f

v]


重複次數是通過量詞指定的,可以緊跟在下面元素之後:


^:匹配字元串開始的位置,如/^Dang/,規定第一個字元必須是D;

$:匹配字元串結尾的位置,如 /duang$/規定g是最後一個字元 ;

():匹配其中的整體為一個原子,如 /(du|D)ang/ 能匹配到duang;

先介紹貪婪模式和懶惰模式匹配,正則表達式中默認是貪婪模式匹配的, 即匹配結果存在歧義的時候取長的,如下

$pattern = "/123.+5/";$subject = "123456654321";$t1 = preg_match_all($pattern, $subject,$matches);var_dump($matches); #12345665

在模式末尾條件U標識符修改為懶惰模式,匹配結果存在歧義的時候取短的:

$pattern = "/123.+5/U";$subject = "123456654321";$t1 = preg_match_all($pattern, $subject,$matches);var_dump($matches); #12345

常見的修正模式總結有:

U/u 懶惰模式/貪婪模式

i 忽略英文字母的大小寫

x 忽略空白 包括製表符和空格

s 將元字元 . 匹配包括換行符在內的所有字元


網上分享非常有非常豐富的常用正則表達式的匹配模式,整理如下:

1 Email地址:^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$

2 域名:[a-zA-Z0-9][-a-zA-Z0-9](/.[a-zA-Z0-9][-a-zA-Z0-9])+/.?

3 InternetURL:[a-zA-z]+://[^s]*

4 手機號碼:^(13[0-9]|14[5|7]|15[0-9])d$

5 電話號碼 ^((d-)|d-)?d$

6 國內電話號碼(0511-4405222、021-87888822):d-d|d-d

7 身份證號(15位、18位數字):^d|d$

8 短身份證號碼(數字、字母x結尾):^([0-9])(x|X)?$ 或 ^d|[0-9x]|[0-9X]?$

9 帳號是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]$

10 密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線):^[a-zA-Z]w$

11 強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字元,長度在8-10之間):^(?=.*d)(?=.*[a-z])(?=.*[A-Z]).$

12 日期格式:^d-d-d

13 一年的12個月(01~09和1~12):^(0?[1-9]|1[0-2])$

14 一個月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$

15 空白行的正則表達式:
s*
(可以用來刪除空白行)

16 首尾空白字元的正則表達式:^s*|s*$

17騰訊QQ號:[1-9][0-9] (騰訊QQ號從10000開始)

18 中國郵政編碼:[1-9]d(?!d) (中國郵政編碼為6位數字)

19 IP地址:d+.d+.d+.d+ (提取IP地址時有用)

正則中還有部分高級特性沒有記錄,如有需要推薦書籍:《精通正則表達式》進行研究;

Bye..

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 通通生活史 的精彩文章:

系統學習PHP之mysqli 基礎篇
系統學習PHP之mysqli 高級篇

TAG:通通生活史 |