1.正則基礎知識
行定位符(^與$)
行定位符是用來描述字符串的邊界?!?”表示行結尾“^”表示行開始如 ^de ,表示以de開頭的字符串 de$ ,表示以de結尾的字符串。
單詞定界符
我們在查找的一個單詞的時候,如an是否在一個字符串”gril and body”中存在,很明顯如果匹配的話,an肯定是可以匹配字符串“gril and body”匹配到,怎樣才能讓其匹配單詞,而不是單詞的一部分呢?這時候,我們可以是喲個單詞定界符/b。
/ban/b 去匹配”gril and body”的話,就會提示匹配不到。
當然還有一個大寫的/B,它的意思,和/b正好相反,它匹配的字符串不能使一個完整的單詞,而是其他單詞或字符串中的一部分。如/Ban/B。
選擇字符(|) ,表示或
選擇字符表示或的意思。如Aa|aA,表示Aa或者是aA的意思。注意使用”[]”與”|”的區別,在于”[]”只能匹配單個字符,而”|”可以匹配任意長度的字符串。在使用”[]”的時候,往往配合連接字符”-“一起使用,如[a-d],代表a或b或c或d。
排除字符,排除操作
html' target='_blank'>正則表達式提供了”^”來表示排除不符合的字符,^一般放在[]中。如[^1-5],該字符不是1~5之間的數字。
限定符(?*+{n,m})
限定符主要是用來限定每個字符串出現的次數。
限定字符 零次或一次 零次或多次 一次或多次 {n,} 至少n次 {n,m} n到m次如(D+)表示一個或多個D
點號操作符
匹配任意一個字符(不包含換行符)
表達式中的反斜杠(/)
表達式中的反斜杠有多重意義,如轉義、指定預定義的字符集、定義斷言、顯示不打印的字符。
轉義字符
轉義字符主要是將一些特殊字符轉為普通字符。而這些常用特殊字符有”.”,”?”、”/”等。
指定預定義的字符集
字符 任意一個十進制數字[0-9] 任意一個非十進制數字 任意一個空白字符(空格、換行符、換頁符、回車符、字表符) 任意一個非空白字符 任意一個單詞字符 任意個非單詞字符###顯示不可打印的字符
字符括號字符()
在正則表達式中小括號的作用主要有:
改變限定符如(|、* 、^)的作用范圍
如(my|your)baby,如果沒有”()”,|將匹配的是要么是my,要么是yourbaby,有了小括號,匹配的就是mybaby或yourbaby。
進行分組,便于反向引用
模式修飾符
模式修飾符的作用是設定模式,也就是正則表達式如何解釋。php中主要模式如下表:
修飾符 忽略大小寫 多文本模式 單行文本模式x
忽略空白字符
U 懶惰模式 (不寫默認貪婪模式)
2.常用php正則函數及示例
a. preg_grep() 函數
preg_grep 函數用于返回匹配模式的數組條目。
語法array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
返回給定數組 input 中與模式 pattern 匹配的元素組成的數組。
參數說明:
$pattern:要搜索的模式,字符串形式。
$input:輸入的數組。
$flags:如果設置為 PREG_GREP_INVERT,這個函數返回輸入數組中與給定模式 pattern 不匹配的元素組成的數組。
實例返回數組中指定匹配的元素:
?php$array = array(1, 2, 3.4, 53, 7.9);// 返回所有包含浮點數的元素$fl_array = preg_grep( /^(/d+)?/./d+$/ , $array);print_r($fl_array);?
執行結果如下所示:
Array [2] = 3.4 [4] = 7.9)
可以看出 preg_grep 只返回了數組中的浮點數。
b.preg_match() 函數
PHP 正則表達式(PCRE)
preg_last_error 函數用于執行一個正則表達式匹配。
語法int preg_match ( string $pattern , string $subject [, array $matches [, int $flags = 0 [, int $offset = 0 ]]] )
搜索 subject 與 pattern 給定的正則表達式的一個匹配。
參數說明:
$pattern: 要搜索的模式,字符串形式。
$subject: 輸入字符串。
$matches: 如果提供了參數matches,它將被填充為搜索結果。 $matches[0]將包含完整模式匹配到的文本, $matches[1] 將包含第一個捕獲子組匹配到的文本,以此類推。
$flags:flags 可以被設置為以下標記值:
PREG_OFFSET_CAPTURE: 如果傳遞了這個標記,對于每一個出現的匹配返回時會附加字符串偏移量(相對于目標字符串的)。 注意:這會改變填充到matches參數的數組,使其每個元素成為一個由 第0個元素是匹配到的字符串,第1個元素是該匹配字符串 在目標字符串subject中的偏移量。
offset: 通常,搜索從目標字符串的開始位置開始??蛇x參數 offset 用于 指定從目標字符串的某個未知開始搜索(單位是字節)。
返回值返回 pattern 的匹配次數。 它的值將是 0 次(不匹配)或 1 次,因為 preg_match() 在第一次匹配后 將會停止搜索。preg_match_all() 不同于此,它會一直搜索subject 直到到達結尾。 如果發生錯誤preg_match()返回 FALSE。
實例查找文本字符串 php :?php//模式分隔符后的 i 標記這是一個大小寫不敏感的搜索if (preg_match( /php/i , PHP is the web scripting language of choice. ))echo 查找到匹配的字符串 php。 } else {echo 未發現匹配的字符串 php。 } ?
執行結果如下所示:
查找到匹配的字符串 php。查找單詞 word
?php/* 模式中的/b標記一個單詞邊界,所以只有獨立的單詞 web 會被匹配,而不會匹配 * 單詞的部分內容比如 webbing 或 cobweb */if (preg_match( //bweb/b/i , PHP is the web scripting language of choice. )) {echo 查找到匹配的字符串。/n } else {echo 未發現匹配的字符串。/n if (preg_match( //bweb/b/i , PHP is the website scripting language of choice. )) {echo 查找到匹配的字符串。/n } else {echo 未發現匹配的字符串。/n } ?
執行結果如下所示:
查找到匹配的字符串。未發現匹配的字符串。獲取 URL 中的域名
?php// 從URL中獲取主機名稱preg_match( @^(?:http://)?([^/]+)@i , http://www.runoob.com/index.html , $matches);$host = $matches[1];// 獲取主機名稱的后面兩部分preg_match( /[^.]+/.[^.]+$/ , $host, $matches);echo domain name is: {$matches[0]}/n ?
執行結果如下所示:
domain name is: runoob.comc.preg_match_all() 函數
PHP 正則表達式(PCRE)
preg_match_all 函數用于執行一個全局正則表達式匹配。
語法int preg_match_all ( string $pattern , string $subject [, array $matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
搜索 subject 中所有匹配 pattern 給定正則表達式的匹配結果并且將它們以 flag 指定順序輸出到 matches 中。
在第一個匹配找到后, 子序列繼續從最后一次匹配位置搜索。
參數說明:
$pattern: 要搜索的模式,字符串形式。
$subject: 輸入字符串
$matches: 多維數組,作為輸出參數輸出所有匹配結果, 數組排序通過flags指定。
$flags:可以結合下面標記使用(注意不能同時使用PREG_PATTERN_ORDER和 PREG_SET_ORDER):
PREG_PATTERN_ORDER: 結果排序為$matches[0]保存完整模式的所有匹配, $matches[1] 保存第一個子組的所有匹配,以此類推。
PREG_SET_ORDER: 結果排序為$matches[0]包含第一次匹配得到的所有匹配(包含子組), $matches[1]是包含第二次匹配到的所有匹配(包含子組)的數組,以此類推。
PREG_OFFSET_CAPTURE: 如果這個標記被傳遞,每個發現的匹配返回時會增加它相對目標字符串的偏移量。
offset: 通常, 查找時從目標字符串的開始位置開始??蛇x參數offset用于 從目標字符串中指定位置開始搜索(單位是字節)。
返回值
返回完整匹配次數(可能是0),或者如果發生錯誤返回FALSE。
實例查找匹配 b 與 /b 標簽的內容:(自己常用獲取$pat_array[1])?php$userinfo = Name: b PHP /b br Title: b Programming Language /b preg_match_all ( / b (.*) //b /U , $userinfo, $pat_array);print_r($pat_array[0]);?
執行結果如下所示:
Array [0] = b PHP /b [1] = b Programming Language /b )d. preg_replace() 函數
preg_replace 函數執行一個正則表達式的搜索和替換。
語法mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int $count ]] )
搜索 subject 中匹配 pattern 的部分, 以 replacement 進行替換。
參數說明:
$pattern: 要搜索的模式,可以是字符串或一個字符串數組。
$replacement: 用于替換的字符串或字符串數組。
$subject: 要搜索替換的目標字符串或字符串數組。
$limit: 可選,對于每個模式用于每個 subject 字符串的最大可替換次數。 默認是-1(無限制)。
$count: 可選,為替換執行的次數。(用于統計被替換的次數)
返回值如果 subject 是一個數組, preg_replace() 返回一個數組, 其他情況下返回一個字符串。
如果匹配被查找到,替換后的 subject 被返回,其他情況下 返回沒有改變的 subject。如果發生錯誤,返回 NULL。
實例將 google 替換為 runoob?php$string = google 123, 456 $pattern = /(/w+) (/d+), (/d+)/i $replacement = runoob ${2},$3 echo preg_replace($pattern, $replacement, $string);?
執行結果如下所示:
runoob 123,456刪除空格字符
?php$str = runo o b $str = preg_replace( //s+/ , , $str);// 將會改變為 runoob echo $str;?
執行結果如下所示:
runoob使用基于數組索引的搜索替換
?php$string = The quick brown fox jumped over the lazy dog. $patterns = array();$patterns[0] = /quick/ $patterns[1] = /brown/ $patterns[2] = /fox/ $replacements = array();$replacements[2] = bear $replacements[1] = black $replacements[0] = slow echo preg_replace($patterns, $replacements, $string);?
執行結果如下所示:
The bear black slow jumped over the lazy dog.使用參數 count
?php$count = 0;echo preg_replace(array( //d/ , //s/ ), * , xp 4 to , -1 , $count);echo $count; //3?
執行結果如下所示:
xp***to3e.preg_split() 函數
preg_replace 函數通過一個正則表達式分隔字符串。
語法array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )
通過一個正則表達式分隔給定字符串。
參數說明:
$pattern: 用于搜索的模式,字符串形式。
$subject: 輸入字符串。
$limit: 可選,如果指定,將限制分隔得到的子串最多只有limit個,返回的最后一個 子串將包含所有剩余部分。limit值為-1, 0或null時都代表 不限制 , 作為php的標準,你可以使用null跳過對flags的設置。
$flags: 可選,可以是任何下面標記的組合(以位或運算 | 組合):
PREG_SPLIT_NO_EMPTY: 如果這個標記被設置, preg_split() 將進返回分隔后的非空部分。
PREG_SPLIT_DELIM_CAPTURE: 如果這個標記設置了,用于分隔的模式中的括號表達式將被捕獲并返回。
PREG_SPLIT_OFFSET_CAPTURE: 如果這個標記被設置, 對于每一個出現的匹配返回時將會附加字符串偏移量. 注意:這將會改變返回數組中的每一個元素, 使其每個元素成為一個由第0 個元素為分隔后的子串,第1個元素為該子串在subject 中的偏移量組成的數組。
返回值返回一個使用 pattern 邊界分隔 subject 后得到的子串組成的數組。
實例獲取搜索字符串的部分?php//使用逗號或空格(包含 , /r, /t, /n, /f)分隔短語$keywords = preg_split( /[/s,]+/ , hypertext language, programming print_r($keywords);?
執行結果如下所示:
Array [0] = hypertext [1] = language [2] = programming)將一個字符串分隔為組成它的字符
?php$str = runoob $chars = preg_split( // , $str, -1, PREG_SPLIT_NO_EMPTY);print_r($chars);?
執行結果如下所示:
Array [0] = r [1] = u [2] = n [3] = o [4] = o [5] = b)分隔一個字符串并獲取每部分的偏移量
?php$str = hypertext language programming $chars = preg_split( / / , $str, -1, PREG_SPLIT_OFFSET_CAPTURE);print_r($chars);?
執行結果如下所示:
Array [0] = Array [0] = hypertext [1] = 0 [1] = Array [0] = language [1] = 10 [2] = Array [0] = programming [1] = 19)3.常用正則(參考作用)
一、校驗數字的表達式
1 數字:
^[0-9]*$
2 n位的數字:
^/d{n}$
3 至少n位的數字:
^/d{n,}$
4 m-n位的數字:
^/d{m,n}$
5 零和非零開頭的數字:
^(0|[1-9][0-9]*)$
6 非零開頭的最多帶兩位小數的數字:
^([1-9][0-9]*)+(.[0-9]{1,2})?$
7 帶1-2位小數的正數或負數:
^(/-)?/d+(/./d{1,2})?$
8 正數、負數、和小數:
^(/-|/+)?/d+(/./d+)?$
9 有兩位小數的正實數:
^[0-9]+(.[0-9]{2})?$
10 有1~3位小數的正實數:
^[0-9]+(.[0-9]{1,3})?$
11 非零的正整數:
^[1-9]/d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^/+?[1-9][0-9]*$
12 非零的負整數:
^/-[1-9][]0-9 *$ 或 ^-[1-9]/d*$
13 非負整數:
^/d+$ 或 ^[1-9]/d*|0$
14 非正整數:
^-[1-9]/d*|0$ 或 ^((-/d+)|(0+))$
15 非負浮點數:
^/d+(/./d+)?$ 或 ^[1-9]/d*/./d*|0/./d*[1-9]/d*|0?/.0+|0$
16 非正浮點數:
^((-/d+(/./d+)?)|(0+(/.0+)?))$ 或 ^(-([1-9]/d*/./d*|0/./d*[1-9]/d*))|0?/.0+|0$
17 正浮點數:
^[1-9]/d*/./d*|0/./d*[1-9]/d*$ 或 ^(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*))$
18 負浮點數:
^-([1-9]/d*/./d*|0/./d*[1-9]/d*)$ 或 ^(-(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*)))$
19 浮點數:
^(-?/d+)(/./d+)?$ 或 ^-?([1-9]/d*/./d*|0/./d*[1-9]/d*|0?/.0+|0)$
二、校驗字符的表達式
1 漢字:
^[/u4e00-/u9fa5]{0,}$
2 英文和數字:
^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
3 長度為3-20的所有字符:
^.{3,20}$
4 由26個英文字母組成的字符串:
^[A-Za-z]+$
5 由26個大寫英文字母組成的字符串:
^[A-Z]+$
6 由26個小寫英文字母組成的字符串:
^[a-z]+$
7 由數字和26個英文字母組成的字符串:
^[A-Za-z0-9]+$
8 由數字、26個英文字母或者下劃線組成的字符串:
^/w+$ 或 ^/w{3,20}$
9 中文、英文、數字包括下劃線:
^[/u4E00-/u9FA5A-Za-z0-9_]+$
10 中文、英文、數字但不包括下劃線等符號:
^[/u4E00-/u9FA5A-Za-z0-9]+$ 或 ^[/u4E00-/u9FA5A-Za-z0-9]{2,20}$
11 可以輸入含有^% =?$/ 等字符:
[^% =?$/x22]+
12 禁止輸入含有~的字符:
[^~/x22]+
三、特殊需求表達式
1、 Email地址:
^/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*$
2 、域名:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3 、InternetURL:
[a-zA-z]+://[^/s]* 或 ^http://([/w-]+/.)+[/w-]+(/[/w-./?% =]*)?$
4 、手機號碼:
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])/d{8}$
5 、電話號碼( XXX-XXXXXXX 、 XXXX-XXXXXXXX 、 XXX-XXXXXXX 、 XXX-XXXXXXXX 、 XXXXXXX 和 XXXXXXXX):
^(/(/d{3,4}-)|/d{3.4}-)?/d{7,8}$
6 國內電話號碼(0511-4405222、021-87888822):
/d{3}-/d{8}|/d{4}-/d{7}
7 、身份證號:
15或18位身份證:
^/d{15}|/d{18}$
15位身份證:
^[1-9]/d{7}((0/d)|(1[0-2]))(([0|1|2]/d)|3[0-1])/d{3}$
18位身份證:
^[1-9]/d{5}[1-9]/d{3}((0/d)|(1[0-2]))(([0|1|2]/d)|3[0-1])/d{4}$
8、 短身份證號碼(數字、字母x結尾):
^([0-9]){7,18}(x|X)?$
或
^/d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
9 、帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
10 、密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線):
^[a-zA-Z]/w{5,17}$
11 、強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在8-10之間):
^(?=.*/d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
12、 日期格式:
^/d{4}-/d{1,2}-/d{1,2}
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 、錢的輸入格式:
16 、1.有四種錢的表示形式我們可以接受: 10000.00 和 10,000.00 , 和沒有 分 的 10000 和 10,000 :
^[1-9][0-9]*$
17、 2.這表示任意一個不以0開頭的數字,但是,這也意味著一個字符 0 不通過,所以我們采用下面的形式:
^(0|[1-9][0-9]*)$
18 、3.一個0或者一個不以0開頭的數字.我們還可以允許開頭有一個負號:
^(0|-?[1-9][0-9]*)$
19 、4.這表示一個0或者一個可能為負的開頭不為0的數字.讓用戶以0開頭好了.把負號的也去掉,因為錢總不能是負的吧.下面我們要加的是說明可能的小數部分:
^[0-9]+(.[0-9]+)?$
20 、5.必須說明的是,小數點后面至少應該有1位數,所以 10. 是不通過的,但是 10 和 10.2 是通過的:
^[0-9]+(.[0-9]{2})?$
21、 6.這樣我們規定小數點后面必須有兩位,如果你認為太苛刻了,可以這樣:
^[0-9]+(.[0-9]{1,2})?$
22、 7.這樣就允許用戶只寫一位小數.下面我們該考慮數字中的逗號了,我們可以這樣:
^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
23 、8.1到3個數字,后面跟著任意個 逗號+3個數字,逗號成為可選,而不是必須:
^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
24 、備注:這就是最終結果了,別忘了 + 可以用 * 替代如果你覺得空字符串也可以接受的話(奇怪,為什么?)最后,別忘了在用函數時去掉去掉那個反斜杠,一般的錯誤都在這里
25 、xml文件:
^([a-zA-Z]+-?)+[a-zA-Z0-9]+//.[x|X][m|M][l|L]$
26 、中文字符的正則表達式:
[/u4e00-/u9fa5]
27 、雙字節字符:
[^/x00-/xff]
(包括漢字在內,可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1))
28 、空白行的正則表達式:/n/s*/r (可以用來刪除空白行)
29 、HTML標記的正則表達式:
(/S*?)[^ ]* .*? //1 | .*? / (網上流傳的版本太糟糕,上面這個也僅僅能部分,對于復雜的嵌套標記依舊無能為力)
30 、首尾空白字符的正則表達式:^/s*|/s*$或(^/s*)|(/s*$) (可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達式)
31 、騰訊QQ號:[1-9][0-9]{4,} (騰訊QQ號從10000開始)
32 、中國郵政編碼:[1-9]/d{5}(?!/d) (中國郵政編碼為6位數字)
33、 IP地址:/d+/./d+/./d+/./d+ (提取IP地址時有用)
以上就是php正則的內容總結(詳細)的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答