想必很多人都對正則表達式都頭疼狱窘,為了讓跟多的新人方便的讀懂陵且,特寫此文裁僧!
1、^ 和 $ 慕购,分別用來匹配字符串的開始和結束聊疲,舉例說明如下:
“^abc$”:就是要求以abc開頭和以abc結尾的字符串,實際上是只有abc匹配沪悲;
2获洲、‘*’ ‘+’ 和 ‘?’他們用來表示一個字符可以出現(xiàn)的次數(shù)或者順序,他們分別表示:
“zero or more”相當于{0,}殿如,“ab*”:和ab{0,}同義贡珊,匹配以a開頭,后面可以接0個或者N個b組成的字符串(”a”, “ab”, “abbb”, 等)涉馁;
“one or more”相當于{1,}门岔,“ab+”:和ab{1,}同義,同上條一樣烤送,但最少要有一個b存在 (”ab” “abbb”等)寒随;
“zero or one.”相當于{0,1},“ab?”:和ab{0,1}同義帮坚,可以沒有或者只有一個b妻往;
“a?b+$”:匹配以一個或者0個a再加上一個以上的b結尾的字符串。
要點:’*’ ‘+’ 和 ‘?’ 只管它前面那個字符试和。
3讯泣、大括號{}
“ab{2}”: 要求a后面一定要跟兩個b(一個也不能少)(”abb”);
“ab{2,}”: 要求a后面一定要有兩個或者兩個以上b(如”abb” “abbbb” 等)阅悍;
“ab{3,5}”:
要求a后面可以有2-5個b(”abbb”, “abbbb”, or “abbbbb”)好渠。
看了上面的例子,你對{n,m}應該理解了吧节视。要注意的是晦墙,n和m都不能為負整數(shù),而且n總是小于m肴茄。這樣晌畅,才能最少匹配n次且最多匹配m次,如”p{1,5}”將匹配
“pvpppppp”中的前五個p寡痰。
4抗楔、小括號()
( )? ? 合并整體匹配棋凳,并放入內(nèi)存,可使用\1 \2…依次獲攘铩剩岳;
“a(bc)*”: 匹配 a 后面跟0個或者一個”bc”;
“a(bc){1,5}”: 一個到5個 “bc”入热;
5拍棕、字符 ‘|’,相當于OR操作
“hi|hello”: 匹配含有”hi” 或者 “hello” 的字符串勺良;
“(b|cd)ef”: 匹配含有 “bef” 或者 “cdef”的字符串绰播;
“(a|b)*c”: 匹配含有這樣多個(包括0個)a或b,后面跟一個c的字符串尚困;
6蠢箩、一個點'.'
可以代表所有的單一字符,不包括”\n”
如果事甜,要匹配包括”\n”在內(nèi)的所有單個字符谬泌,怎么辦?用’[\n.]’這種模式逻谦。
“a.[0-9]”: 一個a加一個字符再加一個0到9的數(shù)字掌实;
“^.{3}$”: 三個任意字符結尾。
7邦马、中括號括住的內(nèi)容只匹配一個單一的字符
“[ab]”: 匹配單個的 a 或者 b ( 和 “a│b” 一樣)贱鼻;
“[a-d]”: 匹配’a’ 到’d’的單個字符 (和”a│b│c│d” 還有 “[abcd]”效果一樣);
一般我們都用[a-zA-Z]來指定字符為一個大小寫英文:
“^[a-zA-Z]”: 匹配以大小寫字母開頭的字符串勇婴;
“[0-9]%”: 匹配含有形如 x% 的字符串;
“,[a-zA-Z0-9]$”: 匹配以逗號再加一個數(shù)字或字母結尾的字符串嘱腥;
你也可以把你不想要得字符列在中括號里耕渴,你只需要在總括號里面使用 ’^’作為開頭
“%[^a-zA-Z]%”:匹配含有兩個百分號里面有一個非字母的字符串。
要點:^用在中括號開頭的時候齿兔,就表示排除括號里的字符橱脸。
為了PHP能夠解釋,你必須在這些字符面前后加雙引號分苇,并且將一些字符轉義添诉。
在中括號里面,所有的特殊字符医寿,包括(”)栏赴,都將失去他們的特殊性質(zhì),“[*\+?{}.]”匹配含有這些字符的字符串靖秩。
8须眷、以\開頭的
\b? ???出現(xiàn)在目標字符串的開頭或結尾的兩個邊界之一竖瘾,邊界可以是空格或者特殊字符;比如’ve\b’花颗,可以匹配love里的ve而不匹配very里有ve捕传。
\B? ???對象必須位于目標字符串的開頭和結尾兩個邊界之內(nèi),即匹配對象既不能作為目標字符串的開頭扩劝,也不能作為目標字符串的結尾庸论;
\s:? ?用于匹配單個空格符,包括tab鍵和換行符棒呛,等價于[\f\t\v]聂示;
\S:? ?用于匹配除單個空格符之外的任何一個字符,[^\f\t\v]条霜;
\d:? ?匹配從0到9的一個數(shù)字催什,等價于[0-9];
\D? ???匹配除數(shù)字以外任何一個字符宰睡,等價于[^0-9]蒲凶;
\w:? ?用于匹配一個字母、數(shù)字或下劃線字符拆内,等價于[0-9a-zA-Z_]旋圆;
\W:? ?用于匹配所有除英文字母、數(shù)字和下劃線以外任何的一個字符麸恍,[^0-9a-zA-Z_]灵巧;
\A? ???匹配字符串串首的原子
\Z? ???匹配字符串串尾的原子
\f? ???匹配一個換頁符等價于 \x0c 或 \cL
匹配一個換行符;等價于 \x0a 或 \cJ
匹配一個回車符等價于\x0d 或 \cM
\t? ???匹配一個制表符抹沪;等價于 \x09\或\cl
\v? ???匹配一個垂直制表符刻肄;等價于\x0b或\ck
\oNN? ?匹配一個八進制數(shù)字
\xNN? ?匹配一個十六進制數(shù)字
\cC? ? 匹配一個控制字符
9、指定某一個范圍而不局限于具體的字符
/[A-Z]/
上述正則表達式將會與從A到Z范圍內(nèi)任何一個大寫字母相匹配融欧。
/[a-z]/
上述正則表達式將會與從a到z范圍內(nèi)任何一個小寫字母相匹配敏弃。
/[0-9]/
上述正則表達式將會與從0到9范圍內(nèi)任何一個數(shù)字相匹配。
/([a-z][A-Z][0-9])+/
-----------------------------------手把手教你如何撰寫正則表達式-------------------------------------
經(jīng)典正則表達式應用1:如何構建一個模式來匹配貨幣數(shù)量的輸入噪馏。
構建一個匹配模式去檢查輸入的信息是否為一個表示money的數(shù)字麦到。
我們認為一個表示money的數(shù)量有四種方式:“10000.00”和“10,000.00”,或者沒有小數(shù)部分欠肾,“10000”and“10,000”瓶颠。
現(xiàn)在讓我們開始構建這個匹配模式:
^[1-9][0-9]*$
這是所變量必須以非0的數(shù)字開頭,但這也意味著單一的”0″也不能通過測試刺桃,以下是解決的方法:
^(0|[1-9][0-9]*)$
“只有0和不以0開頭的數(shù)字與之匹配”粹淋,我們也可以允許一個負號在數(shù)字之前:
^(0|-?[1-9][0-9]*)$
這就是:0或者一個以0開頭且可能有一個負號在前面的數(shù)字。
好了,現(xiàn)在讓我們別那么嚴謹廓啊,允許以0開頭』端眩現(xiàn)在讓我們放棄負號,因為我們在表示錢幣的時候并不需要用到谴轮。我們現(xiàn)在指定模式用來匹配小數(shù)部分:
^[0-9]+(\.[0-9]+)?$
這暗示匹配的字符串必須最少以一個阿拉伯數(shù)字開頭炒瘟。但是注意,在上面模式中“10.”是不匹配的第步, 只有“10”和“10.2”才可以疮装,你知道為什么嗎?
^[0-9]+(\.[0-9]{2})?$
我們上面指定小數(shù)點后面必須有兩位小數(shù)粘都。如果你認為這樣太苛刻廓推,你可以改成:
^[0-9]+(\.[0-9]{1,2})?$
這將允許小數(shù)點后面有一到兩個字符。現(xiàn)在我們加上用來增加可讀性的逗號(每隔三位)翩隧,我們可以這樣表示:
^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$
不要忘記’+’可以被’*’替代如果你想允許空白字符串被輸入話樊展,也不要忘記反斜桿’\’在php字符串中可能會出現(xiàn)錯誤 (很普遍的錯誤)。
經(jīng)典正則表達式應用2:構造檢查email的正則表達式
在一個完整的email地址中有三個部分:
1. 用戶名 (在‘@’左邊的一切) 2.’@’堆生,3. 服務器名
用戶名可以含有大小寫字母阿拉伯數(shù)字专缠,句號(’.’)減號(’-’)and下劃線’_’),服務器名字也是符合這個規(guī)則淑仆,當然下劃線除外涝婉。
現(xiàn)在,用戶名的開始和結束都不能是句點蔗怠,服務器也是這樣墩弯,還有你不能有兩個連續(xù)的句點他們之間至少存在一個字符。
好現(xiàn)在我們來看一下怎么為用戶名寫一個匹配模式:
^[_a-zA-Z0-9-]+$
現(xiàn)在還不能允許句號的存在寞射,我們把它加上:
^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$
上面的意思就是說:以至少一個規(guī)范字符(除了.)開頭渔工,后面跟著0個或者多個以點開始的字符串。
簡單化一點桥温,我們可以用eregi()取代ereg()引矩,eregi()對大小寫不敏感, 我們就不需要指定兩個范圍“a-z”和“A-Z”只需要指定一個就可以了:
^[_a-z0-9-]+(\.[_a-z0-9-]+)*$
后面的服務器名字也是一樣策治,但要去掉下劃線:
^[a-z0-9-]+(\.[a-z0-9-]+)*$
好脓魏,現(xiàn)在只需要用”@”把兩部分連接:
^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$
這就是完整的email認證匹配模式了兰吟,只需要調(diào)用:
eregi(”^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$”,$eamil)
就可以得到是否為email了
-------------------------------正則表達式的其他用法-----------------------------------
提取字符串
ereg() and eregi() 有一個特性是允許用戶通過正則表達式去提取字符串的一部分通惫。
比如說,我們想從 path/URL 提取文件名混蔼,下面的代碼就是你需要:
ereg(”([^\\/]*)$”, $pathOrUrl, $regs);
echo $regs[1];
高級的代換
ereg_replace() 和 eregi_replace()也是非常有用的履腋,假如我們想把所有的間隔負號都替換成逗號:
ereg_replace(”[ \n\r\t]+”, “,”, trim($str));
來源? 麥劍雄技術博客?