php正則表示式
正則表示式考點
引子: 至少寫出一種驗證139開頭的11位手機號的正則表示式的
正則表示式的作用: 分割, 查詢,匹配,替換字串
分隔符: 正斜線(/), hash符號(#),取反(~)
通用原子: \d(10進位制0-9), \D, \w(數字字母下劃線), \W(\w取反), \s(空白符), \S
\d | 10進位制0-9 |
\D | 任意一個非十進位制數字 |
\w | 數字字母下劃線 |
\W | 任意個非單詞字元 |
\s | 任意一個空白字元(空格、換行符、換頁符、回車符、字表符) |
\S | 任意一個非空白字元 |
補充:不可見字元:
字元 | 含義 |
---|---|
\a | 報警 |
\b | 退格 |
\f | 換頁 |
\n | 換行 |
\r | 回車 |
\t | 字表符 |
元字元:
. | 除換行符之外的任意字元 |
* | 前面的內容出現 大於等於0次 |
? | 前面的內容出現0次或者1次 |
^ | 必須以其開頭 |
+ | 前面的內容出現1次或者多次 |
{n} | 前面的內容恰巧出現n次 |
{n,} | 前面的內容出現大於等於n次 |
{n,m} | 前面的內容出現次數介於n和m中間 |
[] | 匹配一個集合,[123]表示匹配1,2,3 |
() | 後向引用或者可以當做一個整體 |
[^] | [^123], 除了1,2,3之外的字元 |
| | 或者 |
[-] | [1-9] 數字1到9 |
$ | 必須以其結尾 |
模式修正符:
i | 不區分大小寫 |
m | 通過分隔符進行分割 |
e | 對匹配出的內容進行處理,php7已經remove |
s | 修正換行 |
U | 取消貪婪模式 |
x | 忽略模式中的空白符 |
A | 必須以模式開頭 |
D | 修正模式對反斜槓的忽略 |
u | 對中文進行匹配的時候能用到 |
後向引用
$str = '<b>abc</b>';
$pattern = '/<b>(.*)<\/b>/';
preg_replace($pattern, '\\1', $str );//匹配abc
貪婪模式
$str = '<b>abc</b><b>bcd</b>';
$pattern = '/<b>.*?<\/b>/';//取消貪婪模式
//$pattern = '/<b>.*</b>/U';//取消貪婪模式
preg_replace_all($pattern, '\\1', $str); //匹配出abc和bcd
正則表示式pcre函式
preg_match,preg_match_all, preg_replace, preg_replace_all
中文匹配
utf-8 漢字編碼範圍: 0x4e00-0x9fa5 需要使用u模式修正符使字串被當成utf-8
ANSI(gb2312): 0xb0-0xf7, 0xa1-0xfe 需要使用chr將ascii碼轉碼為字元
$str = '中文';
$pattern = '/[\x{4e00}-\x{9fa5}]+/u';
//$pattern = '['.chr(0xb0).'-'.chr(0xf7).']['.chr(0xa1).'-'.chr(0xfe).']';
preg_match($pattern, $str, $match);
回到最初的問題:
自左向右的順序使用正則表示式的原子和元字元進行拼接,最終加入模式修正符
$str = '13988888888';
$pattern = '^139\d{8}$';
preg_match($pattern, $str, $match);
補充練習: URL, Email, IP, 手機號碼等
請寫出一個正則表示式,取出頁面中所有img標籤中的src值
$str = '<img alt='test' id='testId' src='test.jpg'/>';
$pattern = '/<img.*?src="(.*?)".*?\/?>/';
preg_match($pattern, $str, $match);
參考:
慕課網