正規表示式的主要作用
- 分割、匹配、查詢、替換
Perl正規表示式函式:
preg_grep($mode,$str) //匹配查詢,返回一個陣列;
preg_match($mode,$str,$return) //在字串中查詢匹配項,返回一個陣列。
preg_match_all($mode,$str,$return [,int flags])
preg_split($mode,$str [,int limit 切割多少次 [,int flags] ] ) //使用正規表示式分割字串,並將結果以陣列的形式返回(類似explode)。
preg_replace($mode,$replacement,$str [,int limit 匹配多少次]) //查詢和替換子字串(類似str_replace)
preg_quote($str) //在每個正規表示式的特殊字元前面加入一個轉義字元(反斜線“\”),正規表示式的特殊字元包括:.\\+*?[^]$(){}=!<>|:
正規表示式中包括的元素
- 原子(普通字元:a-z A-Z 0-9 、原子表、轉義字元)
- 元字元(有特殊功能的字元)
- 模式修正符(系統內建部分字元 i 、m、S、U…)
轉義字元
\d
包含所有數字[0-9]
\D
除所有數字外[^0-9]
\w
包含所有字元(大小寫英文字母、下劃線、數字) [a-zA-Z_0-9]
\W
除所有字元(大小寫英文字母、下劃線、數字)外 [^a-zA-Z_0-9]
\s
空白區域如回車、換行、分頁等 [\f\n\r]
\S
非空白區域如回車、換行、分頁等 [^\f\n\r]
元字元
.
匹配任意次但不包含回車換行*
匹配任意次?
匹配0次或1次+
匹配1次或多次|
選擇匹配(或者)^
匹配開頭(方括號中表示非)$
匹配尾部{m}
匹配前一個內容的重複次數為m次{m,}
匹配前一個內容的重複次數大於等於m次{m,n}
匹配前一個內容的重複次數m次到n次( )
合併整體匹配,並放入記憶體,可使用\1 \2…依次獲取
模式修正符: 【/正則/U 】
小寫i
不區分大小寫小寫m
匹配首內容或尾內容時採用多行識別匹配小寫s
將轉義回車取消視為單行匹配小寫x
忽略正則中的空白大寫A
強制從頭開始匹配大寫D
強制$匹配尾部無任何內容大寫U
禁止貪婪匹配,只跟蹤到最近的一個匹配符並結束,常用在採集程式小寫u
匹配中文
解題方法總結:
1.先寫出一個要匹配的字串
2.自左向右的順序使用正規表示式的原子和元字元拼接
3.加入模式修正符
常用正則
//刪除一對中括號內的內容:
$str = 'abc[url]123[/url]xyz';
$pattern = '/\[url\S*\[\/url\S*\]/';
$str = preg_replace($pattern, '', $str);
echo $str . ''; //輸出:abcxyz
//PHP匹配多對中括號中的內容:
$str = '這是[3]def[25]我的[26]';
$pattern = '/\[([a-z0-9]+)\]/';
preg_match($pattern, $str, $match);
print_r($match);
//匹配所有大括號裡面的內容:
$str = 'abc{title}def{author}mn';
$pattern = '/{(.*)}/U';
preg_match($pattern, $str, $match);
print_r($match);
//匹配網頁原始碼中的圖片路徑:
$str = '<img alt="標題" id="pic" src="http://test.cn/avatar.jpg" />';
$pattern = '/<img.*?src="(.*?)".*?\/?>/i';
preg_match($pattern,$str,$match);
print_r($match);
//匹配當前頁面的所有超連結:
$str = '<a href="http://www.test.com/a.html">跳轉</a>';
$pattern = '/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/i';
preg_match($pattern, $str, $match);
print_r($match);
//匹配郵件
$str = '12345@qq.com';
$pattern = "/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i";
preg_match($pattern, $str, $match);
print_r($match);
//匹配11位手機號:
$str = '13299803211';
$pattern = "/^1(3|5|8)\d{9}$/";
preg_match($pattern, $str, $match);
print_r($match);
//匹配139開頭的11位手機號碼
$str = '13912345678';
$pattern = '/^139\d{8}$/';
preg_match($pattern,$str,$match);
print_r($match);
//UTF-8編碼下提取字串中的中文:
$str = 'hello 中文 byebye';
$pattern = '/[\x{4e00}-\x{9fa5}]+/u';
preg_match($pattern, $str, $match);
print_r($match); //“中文”
//替換字串中的中文為空
$res = preg_replace($pattern,'',$str);
echo $res.’';
//分割中文字串為等長度元素的陣列(英文可以用str_split,但中文會亂碼)
$str = '中文字串';
$res = preg_split('/(?<!^)(?!$)/u', $str);
print_r($res);
//過濾網頁上的所有script標記
$str = '<script type="text/javascript" src="dd.js">alert(123);</script><p style="color: red">測試php正則匹配掉js程式碼</p>';
$pattern = "/<script[\s\S]*?<\/script>/i"; //過濾JS標籤
$pattern = "/<[\/\!]*?[^<>]*?>/si"; //過濾HTML標籤
$res = preg_replace($pattern, "", $str);
echo $res.’';
//替換<b>標籤為空
$str = '<b>abc</b><b>abc</b>';
$pattern = '/<b>(.*?)<\/b>/';
$res = preg_replace($pattern,'\\1',$str);
echo $res.'';
相關連結
www.cnblogs.com/rxbook/p/10912829....
本作品採用《CC 協議》,轉載必須註明作者和本文連結