正则表达式是一个从左往右匹配目标字符串的模式。
正则表达式的基本语法
1.分隔符
模式,即匹配的模板,必须有分隔符闭合包裹(不包裹就无法与正常字符串区分了*^*)。分隔符可以是任意非字母,非数字,非反斜杠,非空白字符。
常用的分隔符有: / ~ # % { }等等
如果分隔符需要在模式内进行匹配,它必须使用反斜杠进行转义。如果分隔符在模式内经常出现,一个更好的选择就是用其他分隔符来提高可读性。
可以在分隔符后边加模式修饰符
2.模式修饰符
模式修饰符 | 作用 |
---|---|
i | 大小写不敏感 |
m(PCRE_MULTILINE) | 多行 |
s | 点号元字符匹配所有字符,包含换行符 |
U | 这个修饰符逆转了量词的”贪婪”模式 |
e | 已经废弃,只对preg_replace起作用,使被替换的字符串被eval解析执行 |
3.元字符
正则表达式的为了源于它可以在模式中拥有选择和重复的能力。一些字符被赋予特殊的含义,使其不再单独代表自己,模式中的这种有特殊含义的编码字符称为 元字符 。
有两种不同的元字符:一种是可以在模式方括号外任何地方使用,另一种需要在方括号内使用。
在方括号外使用的元字符:
元字符 | 含义 | 例子 |
---|---|---|
\ | 一般用于转义 | “/[]/” |
^ | 在字符类外表示行首;仅在作为第一个字符(方括号内)时,表明字符类取反 | “/^…$/”或”/[^qcd]/” |
$ | 行尾 | “/^…$/” |
. | 除换行符外的任意字符 | . |
[] | 字符类定义 | [acd]一个自定义的字符类,[a-z] |
() | 子组定义 | 分组 |
| | 开始一个可选分支 | “/[abc] |
? | 量词,0 次或 1 次匹配;量词后面用于改变量词的贪婪特性 | |
+ | 量词, 1 次或多次匹配 | |
* | 量词,0 次或多次匹配 | |
{} | 自定义量词 | {0,5} |
- | 标记字符范围 | [a-b] |
4.转义序列(反斜线)–四种种用法
用法 | 示例 |
---|---|
转义 | \* |
对非打印字符进行可见编码的控制手段 | \t \n等 |
描述特定的字符类 | 如下 |
简单的断言 | 如下 |
\d
任意十进制数字 等价于 [0-9]
\D
任意非十进制数字 等价于 [^0-9]
\h
任意水平空白字符(since PHP 5.2.4)
\H
任意非水平空白字符(since PHP 5.2.4)
\s
任意空白字符 等价于 [ \f\n\r\t\v]
\S
任意非空白字符 [^ \f\n\r\t\v]
\v
任意垂直空白字符(since PHP 5.2.4)
\V
任意非垂直空白字符(since PHP 5.2.4)
\w
匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9_]”,这里的”单词”字符使用Unicode字符集
\W
匹配任何非单词字符。等价于“[^A-Za-z0-9_]”
\b
单词边界
\B
非单词边界
\A
目标的开始位置(独立于多行模式)
\Z
目标的结束位置或结束处的换行符(独立于多行模式)
\z
目标的结束位置(独立于多行模式)
\G
在目标中首次匹配位置
5.子组 ()
第一个作用:将可选分支局部化。比如,模式cat(arcat|erpillar|)匹配 ”cat”, “cataract”, “caterpillar” 中的一个,如果没有圆括号的话,它匹配的则是 ”cataract”, “erpillar” 以及空字符串。
第二个作用:将子组设定为捕获子组(向上面定义的). 当整个模式匹配后, 目标字符串中匹配子组的部分将会通过 pcre_exec()() 的 ovector 参数回传给调用者。 左括号从左至右出现的次序就是对应子组的下标(从 1 开始), 可以通过这些下标数字来获取捕获子模式匹配结果
解释:
1.分组作用。cat(arcat|erpillar) 这个模式就是用来匹配: catarcat或caterpillar的,没有括号就没办分组,有括号,前边的字符就能与括号内的字符串,选择组合。
2.捕获。会自动捕获括号内的匹配结果,方便后期使用。如果不想捕获,请使用 ?: 例如 (?:king|queen)
6.量词
{a,b} 两个数值必须小于65536
{a,} 表示没有上限
{a} 表示确定的次数
(1)默认情况下量词都是“贪婪”的。也就是说,它们会在不导致模式匹配失败的前提下,尽可能多的匹配字符(直到最大允许的匹配次数)。
(2)然而,如果一个量词紧跟着一个 ?(问号) 标记,它就会成为懒惰(非贪婪)模式, 它不再尽可能多的匹配,而是尽可能少的匹配。
$str = "adb123ddd";
$pattern1 = "/[a-z]+\d+/"; //adb123
$pattern2 = "/[a-z]+\d+?/"; //abd1
//简单的理解贪婪和非贪婪
量词后面紧跟一个 ”+” 是”占有”性。它会吃掉尽可能多的字符, 并且不关注后面的其他模式,比如 .abc 匹配 ”aabc”, 但是 .+abc 不会匹配, 因为 .*+ 会吃掉整个字符串,从而导致后面剩余的模式得不到匹配
PCRE 函数—理解了概念,函数也就只是个工具
1.int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
执行匹配正则表达式
preg_match()返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索,$match存储匹配的结果
2.int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
执行一个全局正则表达式匹配
返回完整匹配次数(可能是0),或者如果发生错误返回FALSE。
3.mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
执行一个正则表达式的搜索和替换
如果subject是一个数组, preg_replace()返回一个数组, 其他情况下返回一个字符串。
如果匹配被查找到,替换后的subject被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL 。
可以匹配数组
4.mixed preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit = -1 [, int &$count ]] )
执行一个正则表达式搜索并且使用一个回调进行替换
和preg_replace相比较,替换的字符串就是回调函数的返回值, string handler ( array matches) matches 是匹配的结果,作为参数传入
5.mixed preg_replace_callback_array ( array $patterns_and_callbacks , mixed $subject [, int $limit = -1 [, int &$count ]] )
6.array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )
通过一个正则表达式分隔字符串
返回一个使用 pattern 边界分隔 subject 后得到 的子串组成的数组, 或者在失败时返回 FALSE
7.mixed preg_filter ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
preg_filter()等价于preg_replace() 除了它仅仅返回(可能经过转化)与目标匹配的结果
8.array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
返回匹配模式的数组条目 ,就是返回 输入的数组中符合模式的项目