在日常開發中我們經常會對用戶輸入的數據進行校驗、對字符串進行提取或者替換,這時候往往會使用正則來實現,那麼今天我給大家分享下正則表達式的一些知識。
一、什麼是正則表達式
正則表達式是一種描述字符串結果的語法規則,是一個特定的格式化模式,可以匹配、替換、截取匹配的字符串。
二、基礎知識
1、行定位符
行定位符是用來描述字符串的邊界。「^」表示行開始,「$」表示行結尾。
如:
"^de",表示以de開頭的字符串
"de$",表示以de結尾的字符串。
如:
^tm:tm equal Tomorrow Moon就可以匹配,而Tomorrow Moon equal tm就不可以匹配.但是如果使用:tm$:則後者可以匹配而前者不可以。如果想要匹配的字串可以出現在字符串的任意部分,那麼可以直接寫成:tm這樣兩者就都能夠匹配了。
2、單詞定界符 \b和\B
我們在查找的一個單詞的時候,如an是否在一個字符串」gril and body」中存在,很明顯如果匹配的話,an肯定是可以匹配字符串「gril and body」匹配到,怎樣才能讓其匹配單詞,而不是單詞的一部分呢?這時候,我們可以是喲個單詞定界符\b。\ban\b 去匹配」gril and body」的話,就會提示匹配不到。當然還有一個大寫的\B,它的意思,和\b正好相反,它匹配的字符串不能是一個完整的單詞,而是其他單詞或字符串中的一部分。如\Ban\B。
3、選擇字符(|) ,表示或
選擇字符表示或的意思。如Aa|aA,表示Aa或者是aA的意思。注意使用」[]」與」|」的區別,在於"[]」只能匹配單個字符,而「|」可以匹配任意長度的字符串。在使用」[]」的時候,往往配合連接字符」-「一起使用,如[a-d],代表a或b或c或d。
4、排除字符,排除操作
正則表達式提供了」^」來表示排除不符合的字符,^一般放在[]中。如[^1-5],該字符不是1~5之間的數字。
5、限定符(?*+{n,m})
限定符主要是用來限定每個字符串出現的次數。
如(D+)表示一個或多個D
6、點號操作符
匹配任意一個字符(不包含換行符)
7、表達式中的反斜槓(\)
表達式中的反斜槓有多重意義,如轉義、指定預定義的字符集、定義斷言、顯示不列印的字符。
8、轉義字符
轉義字符主要是將一些特殊字符轉為普通字符。而這些常用特殊字符有」.」,」?」、」\」等。
指定預定義的字符集
顯示不可列印的字符
9、括號字符()
在正則表達式中小括號的作用主要有:
改變限定符 如(|、* 、^)的作用範圍如(my|your)baby,如果沒有」()」,|將匹配的是要麼是my,要麼是yourbaby,有了小括號,匹配的就是mybaby或yourbaby。進行分組,便於反向引用10、反向引用
反向引用,就是依靠子表達式的」記憶」功能,匹配連續出現的字串或是字符。如(dqs)(pps)\1\2,表示匹配字符串dqsppsdqspps。
例1:
判斷字符串」I am a good boy」中是否包含3個相同的字母
解析:此時,如果我們不使用正則,將會很難判斷,因為字母太多了,我們不可能去將所有字母分別與該字符串比較,那樣工作量也比較大。這時候涉及到了正則的反向引用。在php正則表達式中,通過\n,來表示第n次匹配到的結果。如\5代表第五次匹配到的結果。那麼本題的$pattern='/(\w).*\1.*\1/';
注意:在使用反向匹配的時候都需要使用(),反向匹配時,匹配()裡面出現的字符或字符串。
例2:
去除字符串」gawwenngeeojjgegop」中連續相同的字母
<?php$str='gawwenngeeojjgegop';$pattern='/(.)\1/';$str=preg_replace($pattern,'',$str);
print_r($str);
解析:當然這樣可能會遇到,當第一次去除了重複了字符串後,又出來重複的字符串。如字符串味』gewwenngeeojjgegop』,針對這中問題,當然,這樣的話,通過判斷,繼續替換下去。
例3:
將字符串中」age13gegep3iorji65k65k」;中出現的連續兩個數字改為第二個數字,如字符串中13被改為3
<?php$str='age13gegep3iorji65k65k';$pattern='/(\d)(\d)/';$str=preg_replace($pattern,'$2',$str);
print_r($str);
解析:$n在正則表達式外使用反向引用。n代表第幾次匹配到的結果(n從1開始)。
11、模式修飾符
模式修飾符的作用是設定模式,也就是正則表達式如何解釋。php中主要模式如下表:
三、貪婪匹配與惰性匹配
1、貪婪匹配:就是匹配儘可能多的字符。
比如,正則表達式中m.*n,它將匹配最長以m開始,n結尾的字符串。如果用它來搜索manmpndegenc的話,它將匹配到的字符串是manmpndegen而非man。可以這樣想,當匹配到m的時候,它將從後面往前匹配字符n。
2、懶惰匹配:就是匹配儘可能少的字符。
有的時候,我們需要並不是去貪婪匹配,而是儘可能少的去匹配。這時候,就需要將其轉為惰性匹配。怎樣將一個貪婪匹配轉為惰性匹配呢?只需要在其後面添加一個」?」即可。如m.*?n將匹配manmpndegenc,匹配到的字符串是man。
四、PHP常用正則相關函數
1、preg_match
該函數是進行正則表達式的匹配,成功返回1,否則返回0
2、preg_match_all
該函數用於執行一個全局正則表達式匹配,與preg_match不同的是,該函數是匹配所有符合條件內容。
3、preg_replace
該函數執行一個正則表達式的搜索和替換。
五、PHP示例
1、匹配手機號碼
<?php$str = '13141081058';$re = preg_match('/^1[3456789]\d{9}$/s',$str,$arr);print_r($re);print_r($arr);
輸出結果:
1
Array ( [0] => 13141081058 )
2、匹配E-mail
<?php$str = 'wafu7969@qq.com';$re = preg_match('/^(.+)@(.+)\.(.+)$/s',$str,$arr);print_r($re);print_r($arr);
輸出結果:
1
Array ( [0] => wafu7969@qq.com [1] => wafu7969 [2] => qq [3] => com )
3、URL 中取出域名
<?php$str = 'http://www.baidu.com/?search=強哥';$re = preg_match('/^(http:\/\/|https:\/\/)(.+)\//s',$str,$arr);print_r($re);print_r($arr[0]);
輸出結果:
1
http://www.baidu.com/
4、查找匹配 <b> 與 </b> 標籤的內容
單個p標籤:
<?php$str = '<p>我是強哥</p>';$re = preg_match('/^<p>(.*)<\/p>/s',$str,$arr);print_r($re);print_r($arr[1]);
輸出結果:
1
我是強哥
多個p標籤:
<?php$str = '<p>我是強哥</p><p>你是誰呢?</p>';$re = preg_match_all('/<p>(.*?)<\/p>/m',$str,$arr);print_r($re);print_r($arr[1]);
輸出結果:
2
Array
(
[0] => 我是強哥
[1] => 你是誰呢?
)
注意:這裡要用惰性匹配,注意(.*?)裡面的?。
5、提取圖片的地址
<?php$str = '<img src="http://www.baidu.com/meinv.jpg" />';$re = preg_match('/<img src="(.*)" \/>/s',$str,$arr);print_r($re);print_r($arr[1]);
輸出結果:
1
http://www.baidu.com/meinv.jpg
5、正則替換
把<p></p>中的「我是強哥」替換成「我是誰」
<?php$str = '<p>我是強哥</p>';$str = preg_replace('/^(<p>)(.*)(<\/p>)$/s','\1我是誰\3',$str);print_r($str);
輸出結果:
這裡用到了反向引用,使用反向引用的時候一定要注意:在使用反向匹配的時候都需要使用(),反向匹配時,匹配()裡面出現的字符或字符串。