PHP常用正則表達式匯總
正則表達式在 PHP 中的應(yīng)用
在 PHP 應(yīng)用中帆喇,正則表達式主要用于:
- 正則匹配:根據(jù)正則表達式匹配相應(yīng)的內(nèi)容
- 正則替換:根據(jù)正則表達式匹配內(nèi)容并替換
- 正則分割:根據(jù)正則表達式分割字符串
在 PHP 中有兩類正則表達式函數(shù)贰健,一類是 Perl 兼容正則表達式函數(shù)闹炉,一類是 POSIX 擴展正則表達式函數(shù)鞭盟。二者差別不大个从,而且推薦使用Perl 兼容正則表達式函數(shù)侣监,因此下文都是以 Perl 兼容正則表達式函數(shù)為例子說明鸭轮。
定界符
Perl 兼容模式的正則表達式函數(shù),其正則表達式需要寫在定界符中橄霉。任何不是字母窃爷、數(shù)字或反斜線()的字符都可以作為定界符,通常我們使用 / 作為定界符。具體使用見下面的例子吞鸭。
提示
盡管正則表達式功能非常強大寺董,但如果用普通字符串處理函數(shù)能完成的,就盡量不要用正則表達式函數(shù)刻剥,因為正則表達式效率會低得多遮咖。關(guān)于普通字符串處理函數(shù),請參見《PHP 字符串處理》造虏。
preg_match()
preg_match() 函數(shù)用于進行正則表達式匹配御吞,成功返回 1 ,否則返回 0 漓藕。
語法:
int preg_match( string pattern, string subject [, array matches ] )
參數(shù)說明:
參數(shù) 說明
pattern 正則表達式
subject 需要匹配檢索的對象
matches 可選陶珠,存儲匹配結(jié)果的數(shù)組,$matches[0] 將包含與整個模式匹配的文本享钞,$matches[1] 將包含與第一個捕獲的括號中的子模式所匹配的文本揍诽,以此類推
例子 1 :
<?php
if(preg_match("/php/i", "PHP is the web scripting language of choice.", $matches)){
print "A match was found:". $matches[0];
} else {
print "A match was not found.";
}
?>
瀏覽器輸出:
A match was found: PHP
在該例子中,由于使用了 i 修正符栗竖,因此會不區(qū)分大小寫去文本中匹配 php 暑脆。
提示
preg_match() 第一次匹配成功后就會停止匹配,如果要實現(xiàn)全部結(jié)果的匹配狐肢,即搜索到subject結(jié)尾處添吗,則需使用 preg_match_all() 函數(shù)。
例子 2 份名,從一個 URL 中取得主機域名 :
<?php
// 從 URL 中取得主機名
preg_match("/^(http:\/\/)?([^\/]+)/i","http://www.5idev.com/index.html", $matches);
$host = $matches[2];
// 從主機名中取得后面兩段
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
echo "域名為:{$matches[0]}";
?>
瀏覽器輸出:
域名為:5idev.com
preg_match_all()
preg_match_all() 函數(shù)用于進行正則表達式全局匹配碟联,成功返回整個模式匹配的次數(shù)(可能為零),如果出錯返回 FALSE 僵腺。
語法:
int preg_match_all( string pattern, string subject, array matches [, int flags ] )
參數(shù)說明:
參數(shù) 說明
pattern 正則表達式
subject 需要匹配檢索的對象
matches 存儲匹配結(jié)果的數(shù)組
flags
可選鲤孵,指定匹配結(jié)果放入 matches 中的順序,可供選擇的標記有:
PREG_PATTERN_ORDER:默認辰如,對結(jié)果排序使 $matches[0] 為全部模式匹配的數(shù)組裤纹,matches[0] 為第一組匹配項的數(shù)組丧没,$matches[1] 為第二組匹配項的數(shù)組鹰椒,以此類推
PREG_OFFSET_CAPTURE:如果設(shè)定本標記,對每個出現(xiàn)的匹配結(jié)果也同時返回其附屬的字符串偏移量
下面的例子演示了將文本中所有
標簽內(nèi)的關(guān)鍵字(php)顯示為紅色呕童。
<?php
$str = "<pre>學習php是一件快樂的事漆际。</pre><pre>所有的phper需要共同努力!</pre>";
$kw = "php";
preg_match_all('/<pre>([\s\S]*?)<\/pre>/',$str,$mat);
for($i=0;$i<count($mat[0]);$i++){
$mat[0][$i] = $mat[1][$i];
$mat[0][$i] = str_replace($kw, '<span style="color:#ff0000">'.$kw.'</span>', $mat[0][$i]);
$str = str_replace($mat[1][$i], $mat[0][$i], $str);
}
echo $str;
?>
正則匹配中文漢字
正則匹配中文漢字根據(jù)頁面編碼不同而略有區(qū)別:
GBK/GB2312編碼:[x80-xff]+ 或 [xa1-xff]+
UTF-8編碼:[x{4e00}-x{9fa5}]+/u
例子:
<?php
$str = "學習php是一件快樂的事夺饲。";
preg_match_all("/[x80-xff]+/", $str, $match);
//UTF-8 使用:
//preg_match_all("/[x{4e00}-x{9fa5}]+/u", $str, $match);
print_r($match);
?>
輸出:
Array
(
[0] => Array
(
[0] => 學習
[1] => 是一件快樂的事奸汇。
)
)
平時做網(wǎng)站經(jīng)常要用正則表達式施符,下面是一些講解和例子,僅供大家參考和修改使用:
"^\d+$" //非負整數(shù)(正整數(shù) + 0)
"[1][1-9][0-9]$" //正整數(shù)
"^((-\d+)|(0+))$" //非正整數(shù)(負整數(shù) + 0)
"^-[0-9][1-9][0-9]$" //負整數(shù)
"^-?\d+$" //整數(shù)
"^\d+(.\d+)?$" //非負浮點數(shù)(正浮點數(shù) + 0)
"^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$" //正浮點數(shù)
"^((-\d+(.\d+)?)|(0+(.0+)?))$" //非正浮點數(shù)(負浮點數(shù) + 0)
"^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$" //負浮點數(shù)
"^(-?\d+)(.\d+)?$" //浮點數(shù)
"[2]+$" //由26個英文字母組成的字符串
"[3]+$" //由26個英文字母的大寫組成的字符串
"[4]+$" //由26個英文字母的小寫組成的字符串
"[5]+$" //由數(shù)字和26個英文字母組成的字符串
"^\w+$" //由數(shù)字擂找、26個英文字母或者下劃線組成的字符串
"[6]+(.[\w-]+)*@[\w-]+(.[\w-]+)+$" //email地址
"[7]+://(\w+(-\w+))(.(\w+(-\w+)))(?\S)?$" //url
/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-((0-2)|(3[0|1]))$/ // 年-月-日
/^((0([1-9]{1}))|(1[1|2]))/((0-2)|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年
"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil
/^((+?[0-9]{2,4}-[0-9]{3,4}-)|([0-9]{3,4}-))?([0-9]{7,8})(-[0-9]+)?$/ //電話號碼
"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址
匹配中文字符的正則表達式: [\u4e00-\u9fa5]
匹配雙字節(jié)字符(包括漢字在內(nèi)):[^\x00-\xff]
匹配空行的正則表達式:\n[\s| ]*\r
匹配HTML標記的正則表達式:/<(.)>.</\1>|<(.*) />/
匹配首尾空格的正則表達式:(^\s)|(\s$)
匹配Email地址的正則表達式:\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*
匹配網(wǎng)址URL的正則表達式:[8]+://(\w+(-\w+))(.(\w+(-\w+)))(?\S)?$
匹配帳號是否合法(字母開頭戳吝,允許5-16字節(jié),允許字母數(shù)字下劃線):[9][a-zA-Z0-9_]{4,15}$
匹配國內(nèi)電話號碼:(\d{3}-|\d{4}-)?(\d{8}|\d{7})?
匹配騰訊QQ號:[10][1-9][0-9]$
元字符及其在正則表達式上下文中的行為:
\ 將下一個字符標記為一個特殊字符贯涎、或一個原義字符听哭、或一個后向引用、或一個八進制轉(zhuǎn)義符塘雳。
^ 匹配輸入字符串的開始位置陆盘。如果設(shè)置了 RegExp 對象的Multiline 屬性,^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。
也匹配 ’\n’ 或 ’\r’ 之前的位置。
- 匹配前面的子表達式零次或多次酸员。
- 匹配前面的子表達式一次或多次。+ 等價于 {1,}讳嘱。
? 匹配前面的子表達式零次或一次沸呐。? 等價于 {0,1}。
{n} n 是一個非負整數(shù)呢燥,匹配確定的n 次。
{n,} n 是一個非負整數(shù)寓娩,至少匹配n 次叛氨。
{n,m} m 和 n 均為非負整數(shù),其中n <= m棘伴。最少匹配 n 次且最多匹配 m 次寞埠。在逗號和兩個數(shù)之間不能有空格。
? 當該字符緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時焊夸,匹配模式是非貪婪的仁连。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串阱穗。
. 匹配除 "\n" 之外的任何單個字符饭冬。要匹配包括 ’\n’ 在內(nèi)的任何字符,請使用象 ’[.\n]’ 的模式揪阶。
(pattern) 匹配pattern 并獲取這一匹配昌抠。
(?:pattern) 匹配pattern 但不獲取匹配結(jié)果,也就是說這是一個非獲取匹配鲁僚,不進行存儲供以后使用炊苫。
(?=pattern) 正向預(yù)查裁厅,在任何匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配侨艾,也就是說执虹,該匹配不需要獲取供以后使用。
(?!pattern) 負向預(yù)查唠梨,與(?=pattern)作用相反
x|y 匹配 x 或 y袋励。
[xyz] 字符集合。
[^xyz] 負值字符集合姻成。
[a-z] 字符范圍插龄,匹配指定范圍內(nèi)的任意字符。
[^a-z] 負值字符范圍科展,匹配任何不在指定范圍內(nèi)的任意字符均牢。
\b 匹配一個單詞邊界,也就是指單詞和空格間的位置才睹。
\B 匹配非單詞邊界徘跪。
\cx 匹配由x指明的控制字符。
\d 匹配一個數(shù)字字符琅攘。等價于 [0-9]垮庐。
\D 匹配一個非數(shù)字字符。等價于 [^0-9]坞琴。
\f 匹配一個換頁符哨查。等價于 \x0c 和 \cL。
\n 匹配一個換行符剧辐。等價于 \x0a 和 \cJ寒亥。
\r 匹配一個回車符。等價于 \x0d 和 \cM荧关。
\s 匹配任何空白字符溉奕,包括空格、制表符忍啤、換頁符等等加勤。等價于[ \f\n\r\t\v]。
\S 匹配任何非空白字符同波。等價于 [^ \f\n\r\t\v]鳄梅。
\t 匹配一個制表符。等價于 \x09 和 \cI未檩。
\v 匹配一個垂直制表符卫枝。等價于 \x0b 和 \cK。
\w 匹配包括下劃線的任何單詞字符讹挎。等價于’[A-Za-z0-9_]’校赤。
\W 匹配任何非單詞字符吆玖。等價于 ’[^A-Za-z0-9_]’。
\xn 匹配 n马篮,其中 n 為十六進制轉(zhuǎn)義值沾乘。十六進制轉(zhuǎn)義值必須為確定的兩個數(shù)字長。
\num 匹配 num浑测,其中num是一個正整數(shù)翅阵。對所獲取的匹配的引用。
\n 標識一個八進制轉(zhuǎn)義值或一個后向引用迁央。如果 \n 之前至少 n 個獲取的子表達式掷匠,則 n 為后向引用。否則岖圈,如果 n 為八進制數(shù)字 (0-7)讹语,則 n 為一個八進制轉(zhuǎn)義值。
\nm 標識一個八進制轉(zhuǎn)義值或一個后向引用蜂科。如果 \nm 之前至少有is preceded by at least nm 個獲取得子表達式顽决,則 nm 為后向引用。如果 \nm 之前至少有 n 個獲取导匣,則 n 為一個后跟文字 m 的后向引用才菠。如果前面的條件都不滿足,若 n 和 m 均為八進制數(shù)字 (0-7)贡定,則 \nm 將匹配八進制轉(zhuǎn)義值 nm赋访。
\nml 如果 n 為八進制數(shù)字 (0-3),且 m 和 l 均為八進制數(shù)字 (0-7)缓待,則匹配八進制轉(zhuǎn)義值 nml蚓耽。
\un 匹配 n,其中 n 是一個用四個十六進制數(shù)字表示的Unicode字符命斧。
匹配中文字符的正則表達式: [u4e00-u9fa5]
匹配雙字節(jié)字符(包括漢字在內(nèi)):[^x00-xff]
匹配空行的正則表達式:n[s| ]*r
匹配HTML標記的正則表達式:/<(.)>.</1>|<(.*) />/
匹配首尾空格的正則表達式:(^s)|(s$)
匹配Email地址的正則表達式:w+([-+.]w+)@w+([-.]w+).w+([-.]w+)*
匹配網(wǎng)址URL的正則表達式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?
利用正則表達式限制網(wǎng)頁表單里的文本框輸入內(nèi)容:
用 正則表達式限制只能輸入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"
用正則表達式限制只能輸入全角字符: onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"
用正則表達式限制只能輸入數(shù) 字:onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
用正則表達式限制只能輸入數(shù)字和英 文:onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
=========常用正則式
匹配中文字符的正則表達式: [\u4e00-\u9fa5]
匹配雙字節(jié)字符(包括漢字在內(nèi)):[^\x00-\xff]
匹配空行的正則表達式:\n[\s| ]*\r
匹配HTML標記的正則表達式:/<(.)>.</\1>|<(.*) />/
匹配首尾空格的正則表達式:(^\s)|(\s$)
匹配IP地址的正則表達式:/(\d+).(\d+).(\d+).(\d+)/g //
匹配Email地址的正則表達式:\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*
匹配網(wǎng)址URL的正則表達式:http://(/[\w-]+.)+[\w-]+(/[\w- ./?%&=]*)?
sql語句:^(select|drop|delete|create|update|insert).*$
1、非負整數(shù):^\d+$
2嘱兼、正整數(shù):[11][1-9][0-9]$
3国葬、非正整數(shù):^((-\d+)|(0+))$
4、負整數(shù):^-[0-9][1-9][0-9]$
5芹壕、整數(shù):^-?\d+$
6汇四、非負浮點數(shù):^\d+(.\d+)?$
7、正浮點數(shù):^((0-9)+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$
8踢涌、非正浮點數(shù):^((-\d+.\d+)?)|(0+(.0+)?))$
9通孽、負浮點數(shù):^(-((正浮點數(shù)正則式)))$
10、英文字符串:[12]+$
11睁壁、英文大寫串:[13]+$
12背苦、英文小寫串:[14]+$
13互捌、英文字符數(shù)字串:[15]+$
14、英數(shù)字加下劃線串:^\w+$
15行剂、E-mail地址:[16]+(.[\w-]+)*@[\w-]+(.[\w-]+)+$
16秕噪、URL:[17]+://(\w+(-\w+))(.(\w+(-\w+)))(?\s)?$
或:http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]':+!]*([<>""])*$
17、郵政編碼:[18]\d{5}$
18厚宰、中文:[19]+$
19腌巾、電話號碼:^(((\d{2,3}))|(\d{3}-))?((0\d{2,3})|0\d{2,3}-)?[1-9]\d{6,7}(-\d{1,4})?$
20、手機號碼:^(((\d{2,3}))|(\d{3}-))?13\d{9}$
21铲觉、雙字節(jié)字符(包括漢字在內(nèi)):^\x00-\xff
22澈蝙、匹配首尾空格:(^\s)|(\s$)(像vbscript那樣的trim函數(shù))
23、匹配HTML標記:<(.)>.</\1>|<(.*) />
24撵幽、匹配空行:\n[\s| ]*\r
25灯荧、提取信息中的網(wǎng)絡(luò)鏈接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w||/|.)+('|"| *|>)?
26、提取信息中的郵件地址:\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*
27并齐、提取信息中的圖片鏈接:(s|S)(r|R)(c|C) *= *('|")?(\w||/|.)+('|"| *|>)?
28漏麦、提取信息中的IP地址:(\d+).(\d+).(\d+).(\d+)
29、提取信息中的中國手機號碼:(86)013\d{9}
30况褪、提取信息中的中國固定電話號碼:((\d{3,4})|\d{3,4}-|\s)?\d{8}
31撕贞、提取信息中的中國電話號碼(包括移動和固定電話):((\d{3,4})|\d{3,4}-|\s)?\d{7,14}
32、提取信息中的中國郵政編碼:[1-9]{1}(\d+){5}
33测垛、提取信息中的浮點數(shù)(即小數(shù)):(-?\d*).?\d+
34捏膨、提取信息中的任何數(shù)字 :(-?\d*)(.\d+)?
35、IP:(\d+).(\d+).(\d+).(\d+)
36食侮、電話區(qū)號:/^0\d{2,3}$/
37号涯、騰訊QQ號:[20][1-9][0-9]$
38、帳號(字母開頭锯七,允許5-16字節(jié)链快,允許字母數(shù)字下劃線):[21][a-zA-Z0-9_]{4,15}$
39、中文眉尸、英文域蜗、數(shù)字及下劃線:[22]+$