正則regex有三種匹配模式:單行模式、多行模式、區分大小寫模式
說明:文章舉例說明使用的是php代碼和Regex Match Tracer工具來進行操作的
一、單行模式SingleLine
關鍵字:s
描述:正則在單行模式的情況下會改變(.)點號的含義,why?【這里可能大家有個誤區,普遍認為(.)點號是匹配任意字符的,但是實際上(.)點號是不能匹配換行符的,在windows中它與[^\r\n]是等價的】
$text = '<div id="div"> 123 abc 456 def </div>'; preg_match('/<div\s*id\s*=\s*[\'"]div[\'"]>(.*)<\/div>/', $text, $match); var_dump($match); # 返回的結果是array(0){}
因為在很多情況下我們都會使用到單行模式,比如經常會獲取html網頁源碼,然后進行重點匹配某些內容,那html源碼存在很多的換行和回車符,這個時候單行模式就很有作用了,上邊的代碼正則字符串中沒有使用任何的修飾符(<div\s*id\s*=\s*[\'"]div[\'"]>(.*)<\/div>),直接進行匹配發現匹配失敗,原因上邊已經說了就是(.)點號是不能匹配換行符的,這是個誤區(注意),下面我們在正則表達式上添加單行模式關鍵字s來進行匹配:
$text = '<div id="div"> 123 abc 456 def </div>'; preg_match('/<div\s*id\s*=\s*[\'"]div[\'"]>(.*)<\/div>/s', $text, $match); var_dump($match['1']); # 返回的結果是: //string(30) " // 123 // abc // 456 // def //"
重要的事情說三遍:(.)點號不匹配換行符,在windows中與[^\r\n]等價,並不是刻意匹配任意字符
二、多行模式MultiLine(使用php來操作看的不是很明顯)
關鍵字:m
描述:多行模式下會改變^和$的含義【^和$是匹配整個字符串的開頭和結尾】,使它在任意一行的行首和行尾進行匹配
擴展:在支持此模式的程序通常都提供\A和\Z兩種修飾符,他們跟普通的^和$是一樣的作用,但是^和$在多行模式下會改變含義,而\A和\Z他們的含義始終不會被改變,一直都匹配整個字符的開頭和結尾
這是沒有選擇多行模式的,匹配失敗,原因剛才也說了,接下來咱們選擇多行模式進行匹配:
重要的事情說三遍:多行模式下^和$的含義會被改變,普通的含義是匹配整個字符串的開頭和結尾,在多行模式下匹配的就是每一行的行首和行尾
三、不區分大小寫模式
關鍵字:i
描述:這個很好理解,就是當你使用了不區分大小寫模式匹配的時候,不論是大寫還是小寫都會匹配到
$text = 'The'; preg_match('/^the$/', $text, $match); var_dump($match); # 返回的結果是:array(0){}
接下來使用關鍵字進行匹配:
$text = 'The'; preg_match('/^the$/i', $text, $match); var_dump($match); # 返回的結果是: //array(1) { // [0]=> // string(3) "The" //}
四、總結:
模式 | 定義 | 關鍵字 |
單行模式 | (.)點號不匹配換行符,在windows中與[^\r\n]等價,並不是刻意匹配任意字符,在單行模式下會改變點號的含義,做到匹配任意字符 | s |
多行模式 | 多行模式下^和$的含義會被改變,普通的含義是匹配整個字符串的開頭和結尾,在多行模式下匹配的就是每一行的行首和行尾,而\A和\Z他們的含義始終是匹配整個字符串的開頭和結尾 | m |
不區分大小寫模式 | 指定不區分大小寫的匹配。 | i |