PHP 正則
基礎概念
正則表達式是通過一系列符合某個規則的字符串來匹配要搜索的內容。正則表達式有三
種用法:
1.匹配:從某個字符串抽取信息;
2.替換:新文本替換匹配的舊文本;
3.分組:把字符串拆分成小塊字符串的數組
匹配規則
使用 preg_match 函數可以實現對正則表達式的匹配能力。
//第一個參數是正則模式,第二個參數是需要匹配的字符串
$flag = preg_match(‘/ycku/‘, ‘ycku‘);
//匹配成功返回 1,否則返回 0
echo $flag
正則量詞
//匹配的字符串至少包含一個 c,ycku 和 ycccku 都能匹配
echo preg_match(‘/yc+ku/‘, ‘ycku‘);
//匹配的字符串至少包含零個、一個或多個,yku、ycku 和 ycccku 都能匹配
echo preg_match(‘/yc*ku/‘, ‘ycku‘);
//匹配的字符串至少包含零個或一個,yku 和 ycku 都能匹配
echo preg_match(‘/yc?ku/‘, ‘ycku‘);
//匹配的字符串可以是任意一個字符,abcd 等都能匹配
echo preg_match(‘/y.ku/‘, ‘ycku‘);
//匹配的字符串可以是任意一個或多個字符
echo preg_match(‘/y.+ku/‘, ‘ycku‘);
//匹配的字符串必須兩位
echo preg_match(‘/yc{2}ku/‘, ‘yccku‘);
//匹配的字符串必須 2-4 位之間
echo preg_match(‘/yc{2,4}ku/‘, ‘ycccku‘);
//匹配的字符串必須兩位以上
echo preg_match(‘/yc{2,}ku/‘, ‘ycccccku‘);
//匹配的字符串必須從頭部和尾部開始匹配
echo preg_match(‘/^sf$/‘, ‘www.dsf.com‘);
//匹配左邊或匹配右邊
echo preg_match(‘/ycku|sa/‘, ‘safd‘);
//分組匹配,可以數組輸出
preg_match(‘/(y)(c)(k)(u)/‘, ‘ycku‘, $matches);
print_r($matches)
元字符
//匹配 a-z 中的其中一個字符
echo preg_match(‘/[a-z]/‘, ‘a‘);
//匹配 A-Z 中的其中一個字符
echo preg_match(‘/[A-Z]/‘, ‘A‘);
//匹配 0-9 中的其中一個字符
echo preg_match(‘/[0-9]/‘, ‘1‘);
//匹配 abc 中其中一個
echo preg_match(‘/[abc]/‘, ‘a‘);
//匹配不包含 abc 中任意一個
echo preg_match(‘/[^abc]/‘, ‘d‘);
//匹配 a-z、A-Z、0-9 和_
echo preg_match(‘/[a-zA-Z0-9_]/‘, ‘a‘);
//匹配 a-z、A-Z、0-9 和_
echo preg_match(‘/\w/‘, ‘a‘);
//匹配非 a-z、A-Z、0-9 和_
echo preg_match(‘/\W/‘, ‘a‘);
//匹配 0-9
echo preg_match(‘/\d/‘, ‘1‘);
//匹配非 0-9
echo preg_match(‘/\D/‘, ‘1‘);
//匹配空白字符
echo preg_match(‘/\s/‘, ‘ ‘);
//匹配非空白字符
echo preg_match(‘/\S/‘, ‘a‘);
//匹配單詞的邊界
echo preg_match(‘/^abc\b$/‘, ‘abc‘);
//匹配非單詞的邊界
echo preg_match(‘/^ab\Bc$/‘, ‘abc‘);
//匹配特殊字符
echo preg_match(‘/\//‘, ‘/‘);
修飾符
//匹配時不區分大小寫
echo preg_match(‘/ycku/i‘, ‘YCKU‘);
//匹配時多行識別,換行處理解為結尾
echo preg_match(‘/ycku$/m‘, "This is ycku\n, This is a teacher!");
//匹配時忽略掉模式中的空白
echo preg_match(‘/yck u/x‘, ‘ycku‘);
//匹配時必須從頭開始匹配
echo preg_match(‘/ycku/A‘, ‘ycku‘);
正則函數
1.使用 preg_grep 函數返回匹配模式的條目。
//需要匹配的數組
$language = array(‘php‘, ‘asp‘, ‘jsp‘, ‘python‘, ‘go‘);
//匹配返回新數組
$array = preg_grep(‘/p$/‘, $language);
//輸出
print_r($array);
//取反操作
$array = preg_grep(‘/p$/‘, $language, PREG_GREP_INVERT);
2.使用 preg_match_all 函數匹配返回所有匹配元素。
//進行全局匹配
preg_match_all(‘/php[1-6]/‘,
‘php1sdflkjphp2sdlkfjphp3sdfsphp4‘, $array);
//輸出
print_r($array);
3.使用 preg_quote 函數將帶有正則符號的字符轉義
//將正則的特殊字符轉義
echo preg_quote(‘[第一回]‘);
//指定要轉義的字符
echo preg_quote(‘[第一回/]‘, ‘/‘);
4.使用 preg_split 函數分割匹配到的字符串
//按照.和@進行分割
$array = preg_split(‘/[\.@]/‘, ‘[email protected]‘);
//輸出
print_r($array)
5.使用 preg_replace 函數進行搜索和替換。
//替換並輸出
echo preg_replace(‘/php[1-6]/‘, ‘ruby‘, ‘This is php5, This is php4‘);
註意:還有一個等價函數:preg_filter,支持版本為:>=5.3、7
6.使用 preg_replace_callback 搜索後在回調裏進行替換。
//輸出
echo preg_replace_callback(‘/(\w+)\s(\w+)/‘, function($matches){
return $matches[2];
} , ‘My php7‘);
7.使用 preg_replace_callback_array 搜索後在回調函數裏進行替換。
//只支持 PHP7
echo preg_replace_callback_array(
array(
‘/(\w+)\s(\w+)/‘=>function ($matches) {
return $matches[2];
}
)
, ‘My php7‘);
正則模式
1.電子郵件驗證
//用戶名部分可以包含 a-zA-z0-9_可以用\w,還包含.和-號
//域名部分只要是 a-z0-9 外加-號
//後綴部分限制在 2-4 位,只能是英文字母
//電子郵件驗證不區分大小寫
echo preg_match(‘/^([\w\.-]+)@([a-z0-9-]+)\.([a-z]{2,4})$/i‘,
2.使用修飾符 U 禁止貪婪
//把<b>...</b>替換成<strong>...</strong>
echo preg_replace(‘/<b>(.*)<\/b>/U‘, ‘<strong>\1</strong>‘, ‘This is a
<b>teacher</b>!This is a <b>teacher</b>!‘);
註意:這裏用到了分組的反向引用\1,表示獲取源字符串的對應模式的第一個分組的
內容。U 禁止貪婪在這裏例子很明顯,就是盡可能匹配最近的字符,而不是最遠的。
3.前後斷言模式
這種模式,表示當前的字符的前後緊跟的是不是指定的字符,如果是就匹配成功,反之
不成功
//大的前面一個字符緊跟著斯
//大的後面一個字符緊跟著林
echo preg_match(‘/(?<=斯)大(?=林)/‘, ‘俄國的斯大林同誌!‘);
//大的前面一個字符不能緊跟著斯
//大的後面一個字符不能緊跟著林
echo preg_match(‘/(?<!斯)大(?!林)/‘, ‘俄國的斯大林同誌!‘);
4.設置非捕獲組?:
//?:可以設置當前組不被捕獲到
preg_match(‘/(?:[\w-]+)\.([a-z]{2,4})/‘, ‘ycku.com‘, $matches);
//輸出
print_r($matches);
5.逆向引用
//\1 表示第一個分組匹配到的值,用這個值進行匹配
preg_match(‘/([a-zA-Z]+)\s\1/‘, ‘This This is a teacher!‘, $matches);
//輸出
print_r($matches);
6.惰性匹配
//只要在要匹配的量詞後面加個問號,就能實現惰性匹配
preg_match(‘/This+?/i‘, ‘Thisssssssssssss‘, $matches);
//輸出
print_r($matches);
PHP 正則