正则表达式之单行模式、多行模式、区分大小写模式
2017-12-07 13:55 ZengGW 阅读(17862) 评论(0) 编辑 收藏 举报正则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 |