PHP-PCRE正则表达式

正则表达式是一个从左往右匹配目标字符串的模式。

正则表达式的基本语法

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 ] ) 返回匹配模式的数组条目 ,就是返回 输入的数组中符合模式的项目

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值