正則表達式基礎
1. ‘^’和 $’ 表示用來匹配字符串的開始和結束。(^有兩種用法,下一種,見下面)
- “^mtg”: 匹配以 “mtg”開頭的字符串;
- “mtg$”: 匹配以 “mtg” 結尾的字符串;
- “^mtg$”: 匹配以mtg開頭和以mtg結尾的字符串,實際上是隻有abc與之匹配
2. ‘*’表示0次或者多次,‘+’表示1次或多次,‘?’表示0次或1次
- “ab*”: 匹配字符串a和0個或者多個b組成的字符串
- “ab*”: 匹配字符串a和1個或者多個b組成的字符串
- “ab?”: 匹配字符串a和0個或者1個b組成的字符串
3. 大括號裏面控制字符出現的個數
- “ab{2}”: 匹配一個a後面只跟兩個b;
- “a(bc){2,}”: 匹配一個a至少跟兩個bc;
- “ab{3,5}”: 匹配一個a跟3到5個b”.
4.字符 ‘│’, 相當於OR 操作
- “(a│bc)de”: 匹配含有 “ade” 或者 “bcde”的字符串;
5.一個點’.’可以代表除換行符之外的任意單個字符,中括號括住的內容只匹配一個單一的字符
- “a.[0-9]”: 匹配一個a跟一個字符再跟一個數字
如果需要匹配包含換行符在內的任意字符
"([\s\S]*)" 或"([\d\D]*)" 或"([\w\W]*)" 來表示。
6.[^x]:匹配除了 x 意外的任意字符
- “[^x]*”: 表示匹配除x外的任意字符
7.常用的元字符
- “\w”: 匹配字母或數字或下劃線
- “\W”: \w的反義,即匹配任意非字母,數字,下劃線和漢字的字符
- “\d”: 匹配數字
- “\D”: \d的反義,即匹配任意非數字的字符
- “\s”: 匹配任意的空白符
- “\S”: \s的反義,即匹配任意非空白符的字符
- “\b”: 匹配單詞的開始或結束
- “\B”: \b的反義,即不是單詞開頭或結束的位置
下面的代碼是對\b的用法的實例,preg_match_all()函數下面將介紹:
$str="hi history";
preg_match_all("/\bhi\b/",$str,$arr);
preg_match_all("/hi/",$str,$arr1);
var_dump($arr);
var_dump($arr1);
輸出爲:
array(1) {
[0]=>
array(1) {
[0]=>
string(2) "hi"
}
}
array(1) {
[0]=>
array(2) {
[0]=>
string(2) "hi"
[1]=>
string(2) "hi"
}
}
即”\b”只匹配單個的單詞
8.正則表達式中需要轉義的特殊字符:
* . ? + $ ^ [ ] ( ) { } | \ / " "
如[,如果需要轉義使用 \[
;
下面的代碼是關於\[
的使用代碼:
$str="[123]";
preg_match_all("/\[([^\]]*)\]/",$str,$arr);//更簡單的正則式爲
"/\[(.*)\[/"
var_dump($arr);
輸出爲
array(2) {
[0]=>
array(1) {
[0]=>
string(5) "[123]"
}
[1]=>
array(1) {
[0]=>
string(3) "123"
}
}
9.preg_match()函數:
函數原型:
int preg_match( string pattern, string subject [, array matches ] )
成功返回 1 ,否則返回 0 。
參數:
- pattern 正則表達式
- subject 需要匹配檢索的對象
- matches 可選,存儲匹配結果的數組,
matches[0]將包含與整個模式匹配的文本, matches[1] 將包含與第一個捕獲的括號中的子模式所匹配的文本,以此類推
提示:preg_match() 第一次匹配成功後就會停止匹配,如果要實現全部結果的匹配,即搜索到subject結尾處,則需使用 preg_match_all() 函數。
例如:
$str=" aabab ";
preg_match("/a.*?b/",$str,$arr);
var_dump($arr);
輸出爲
array(1) {
[0]=>
string(3) "aab"
}
10.preg_match_all()函數:
函數原型:
int preg_match_all( string pattern, string subject, array matches [, int flags ] )
成功返回整個模式匹配的次數(可能爲零),如果出錯返回 FALSE 。
參數:
- pattern 正則表達式
- subject 需要匹配檢索的對象
- matches 存儲匹配結果的數組
- flags
可選,指定匹配結果放入 matches 中的順序,可供選擇的標記有:
- PREG_PATTERN_ORDER:默認,對結果排序使
matches[0]爲全部模式匹配的數組, matches[1] 爲第一個括號中的子模式所匹配的字符串組成的數組,以此類推 - PREG_SET_ORDER:對結果排序使
matches[0]爲第一組匹配項的數組, matches[1] 爲第二組匹配項的數組,以此類推 - PREG_OFFSET_CAPTURE:如果設定本標記,對每個出現的匹配結果也同時返回其附屬的字符串偏移量
- PREG_PATTERN_ORDER:默認,對結果排序使
$str=" <p>abcde</p> <p>fghij</p> ";
preg_match_all("/<p>(.*?)<\/p>/",$str,$arr);
var_dump($arr);
array(2) {
[0]=>
array(2) {
[0]=>
string(12) "<p>abcde</p>"
[1]=>
string(12) "<p>fghij</p>"
}
[1]=>
array(2) {
[0]=>
string(5) "abcde"
[1]=>
string(5) "fghij"
}
}
11.模式修正符的使用
12.貪婪模式(儘可能的匹配更多內容)和非貪婪模式(儘可能的匹配更少的內容)
如字符串aabab:
- 貪婪模式:pattern爲”/a.*b/”匹配的結果爲aabab。
- 非貪婪模式: pattern爲”/a.*?b/”匹配的結果爲aab和ab
13.向後引用
定義:當用“()”定義了一個正則表達式組後,正則引擎則會把被匹配的組按照順序編號,存入緩存。當對被匹配的組進行向後引用的時候,可以用“\數字”的方式進行引用。”\1“引用第一個匹配的後向引用組,”\2”引用第二個組,以此類推,”\n”引用第n個組。而”\0”則引用整個被匹配的正則表達式本身。我們看一個例子。
假設你想匹配一個HTML標籤的開始標籤和結束標籤,以及標籤中間的文本。例如
<B>This is a test</B>
則pattern爲
<(.*)>.*<\/\1>
14.常用正則表達式
- E-mail地址:
^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$
- 2.URL:
^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$
- 郵政編碼:
^[1-9]\d{5}$
- 手機號碼:
^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$
- 匹配HTML標記:
<(.*)>.*<\/\1>|<(.*) \/>
- 提取信息中的圖片鏈接:
(s|S)(r|R)(c|C) *= *('|")?(\w|\|\/|\.)+('|"| *|>)?
- 提取信息中的中國手機號碼:
(86)*0*13\d{9}
- 提取信息中的中國固定電話號碼:
(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}
- 騰訊QQ號:
`^[1-9]*[1-9][0-9]*$
- 千里碼的一道題:寫一個正則表達式來匹配這些符合要求的身份證號(出生年份在1985-1995的男性用戶):
^[\d]{6}19(8[5-9]|9[0-5])[\d]{6}[013579][0-9xX]$