概述
- 正则表达式,就是一个匹配的
模式
。 - 正则表达式,就是一个字符串(其中有一些语法规则,特殊字符)。
- 正则表达式这个字符串,一定要在对应的函数中使用。(分割的函数,替换的函数)
组成
-
定界符
定界符号可以使用多种符号,常用为
//
-
原子
原子是最少的一个匹配单位,在一个正则表达式中,至少要有一个原子(写在定界符中)。
-
常见原子
\d 代表任意一个数字 。 例如:0-9
\D 代表任意一个非数字,也就是除了 0-9 之外的所有字符,等同于 ·
[^0-9]
\w 代表任意一个字 。例如:a-z、A-Z、0-9、_
\W 代表任意一个非字,也就是除了 a-z、A-Z、0-9、_ 之外的所有字符
\s 代表空白。例如:空格、回车、换行、tab。
\S 代表非空白,也就是除了 空格、回车、换行、tab之外的字符。
-
自定义原子表 []
[0-9] 代表匹配所有数字
[a-z] 代表匹配小写字母 a 到字母 z
[A-Z] 代表匹配大写字母 A 到字母 Z
[a-zA-Z] 代表匹配所有字母
[^a-zA-Z] 代表匹配除了字母以外的字符。在[]内才是排除的意思。
-
表示从哪到哪区间范围^
表示列表中的 -
匹配所有
.
-
-
元字符
元字符不能在正则表达式中单独使用,修饰原子,是用来扩展原子功能和限定原子功能的(写在定界符中)。
*
用来修饰其前面的原子
可以出现 0个 1个 或 多个。(任意次) 等价于{0,}
+
用来修饰其前面的原子
可以出现 1次 或 多次,不能没有,至少要出现一次。 等价于{1,}
?
用来修饰其前面的原子
可以出现 0次 或 1次。等价于{0,1}
(可以取消贪婪模式){m}
用来修饰其前面的原子
只能出现 m 次,多一次和少一次都不行。{n,m}
用来修饰其前面的原子
出现个数在 n 到 m 之间,包括 n 和 m。{n,}
用来修饰其前面的原子
出现的次数至少 n 次。|
是或的关系,表示它两边的原子,只要有一个出现就可以,但是,|
的优先级是最低的,所以常加括号来提升优先级。^
或\A
表示必须以什么开始,这个必须写在正则表达式的最前面。$
或\Z
表示必须以什么结束,这个必须写在正则表达式的最后面。\b
单词边界//根据className获取元素(根据类名来获取元素) function getClass(oParent, sClass) { var aEle = oParent.getElementsByTagName('*'); var reg = new RegExp( '\\b' + sClass + '\\b', 'i' ); var res = []; for(var i=0;i<aEle.length;i++) { if( reg.test(aEle[i].className) ) { res.push( aEle[i] ); } } return res; }
\B
非单词边界()
括号 ★★★★★-
作用一:改变优先级别
-
作用二:将小原子,变成大原子
-
作用三:子模式,整个表达式是一个大的模式,小括号中是每个独立的子模式。
-
作用四:反向引用。
- \1表示第一个子模块 (子模式)
- \2表示第二个子模块 (子模式)
- \3表示第三个子模块 (子模式)
-
如果我们出现了2个括号,但是第一个括号不是子模式,也可以去掉子模式,使用
?:
$str = "2019-01-28"; $reg = '/\d{4}(-|\/)\d{2}\1\d{2}/'; //第一个括号是子模式 $reg = '/(?:\d{4})(-|\/)\d{2}\1\d{2}/'; //第一个括号不是子模式,使用 `?:` 来去掉子模式
PS:在双引号中,反引号
\
是属于转义字符,所以需要再进行转义,去掉它的意义。 -
-
模式修正符
-
概述
- 模式修正符是对模式(正则)进行修正使用的(写在定界符外,在右边)。
- 模式修正符,一个字符就是一个功能,可以组合使用。
-
作用
模式修正符可以修正正则表达式的解释,或扩充了正则表达式的功能。
-
修正符号
i
修正正则表达式不区分大小写(默认是区分大小写)m
修正正则表达式可以视为多行,在使用^
或$
这两个符号时,每一行满足都可以。(默认视为一行处理)$single _str = "this is a test"; //没有回车(单行) $multi_str = "this is a test but this content is larger and so on..."; //有回车 (多行) // 一个字符串默认就算有回车也是一行,但 m 这个模式修正符可以把回车也视为一行
s
修正正则表达式中的.
可以匹配换行符。(默认匹配不了换行符)$str = "th is is a test"; $reg = '/this/s'; //可以忽略换行匹配到this
x
修正正则表达式中,可以忽略空白。$str = "this is a test web server"; $reg = '/webserver/x'; //可以忽略 web server 中的空白,匹配到 web server
e
在执行字符串替换的时候,执行字符串中的函数。$str = "http://www.baidu.com"; $rules = '/(http:\/\/www)\.(.*?)\.(com)/e'; echo preg_replace( $rules, "strtoupper('$1.$2.$3')", $str ); //输出 HTTP://WWW.BAIDU.COM
U
解除贪婪模式匹配,但是一般不这样用,因为其他语言没有这样用法,那怎么解除贪婪呢?可以使用 (.*?) 或 (.+?) 解除贪婪。//需求:匹配 b 标签中的内容 $str = "this <b>is</b> a test <b>web</b> server"; $reg = '/\<b\>(.*)\<\/b\>/is'; //匹配 b 标签中的内容,b 标签可以没有内容也能匹配。此时的匹配结果为<b>is</b> a test <b>web</b>太贪婪 $reg = '/\<b\>(.*?)\<\/b\>/is'; //可以解除贪婪
-
正则表达式的编写
- 正则表达式就是一门语言,把开发思想放进去。
- 列需求,一条一条满足,需求越详细,写的时候越方便。
相关函数
匹配查找
- preg_match — 执行一个正则表达式匹配(匹配第一个满足条件的)
- preg_match_all — 执行一个全局正则表达式匹配(匹配全部满足条件的)
- preg_grep — 在数组中搜索包含指定值的元素,返回一个新数组(符合条件的匹配结果)
分割
- preg_split — 通过一个正则表达式分隔字符串
替换
- preg_replace — 执行一个正则表达式的搜索和替换
- preg_filter — 执行一个正则表达式搜索和替换
其他
-
preg_replace_callback — 执行一个正则表达式搜索并且使用一个回调进行替换
// 需求:让年份加1 $str = '2019-02-12'; $reg = '/(\d{4})(-\d{2}-\d{2})/'; function myfn( $matches ) { return ($matches[1]+1) . $matches[2]; } echo preg_replace_callback($reg, 'myfn', $str); /* * 正则表达式中的括号(),可以变成子模式。 */
-
preg_replace_callback_array — Perform a regular expression search and replace using callbacks
-
preg_quote — 转义正则表达式字符
常用匹配格式
-
匹配html标签。
$reg = '/\<[\/\!]*?[^\<\>]+?\>/is';
-
匹配URL。
$reg = '/([https?ftps?]):\/\/(www|mail|bbs|ftp)\.(.*?)\.(net|org|com|cn)([\w-\.\/\=\?\&\%]*)?/';
扩展PHP收集函数参数
$args = func_get_args();
//返回值是一个数组,数组中储存了参数列表