PHP正则表达式

PHP的正则表达式

标签(空格分隔): 正则表达式 PHP


什么是正则表达式

正则表达式是对字符串进行操作的一种逻辑公式,就是用一些特定的字符组合成一个规则字符串,称之为正则匹配模式。

比如:

$p = '/apple/';
$str = 'apple banna';
if (preg_match($p, $str)) {
    echo 'success';
}

其中的字符串'/apple/'就是一个正则表达式,用来匹配源字符串中的apple。preg_match会返回匹配的次数0或1,因为preg_match在第一次匹配后会停止搜索,出现错误会返回false。更过的函数需参考PCRE函数

基本语法

在PCRE的正则语法中,正则模式使用分隔符与元字符组成。模式需要由分隔符闭合包裹。
分隔符可以是任意非字母数字、非反斜线、非空白字符。

经常使用的分隔符是/#以及~

例如:

/foo/

[0-9]$#

php

如果模式中包含分隔符,则需要使用反斜线进行转义。

/http:///

如果模式中包含过多的分隔符,建议使用其他的字符作为分隔符,例如:

/http:/// ====> #http://#

或者使用preg_quote()函数对模式字符串进行转义它的第二个参数(可选)可以用于指定需要被转义的分隔符。

$p = 'http://';
$p = '/' . preg_quote($p, '/') . '/';

除了上面提到的分隔符,也可以使用括号样式的分隔符,左括号和右括号分别作为开始和结束 分隔符。

{http://}

可以在结束分隔符后面增加模式修饰符。#[a-z]#i是一个大小写不敏感的匹配。

元字符:
元字符就是一些被赋予了特殊含义的字符。元字符有两种:

  • 一种是是可以在模式中方括号外任何地方使用的
  • 另外一种是需要在方括号内使用的。

在方括号外使用的元字符如下:

当使用在方括号中是不再具有特殊含义,而代表的就是其本身。[$]表示匹配$

  • 一般用于转义字符
  • ^断言目标的开始位置(或在多行模式下是行首)
  • $断言目标的结束位置(或在多行模式下是行尾)
  • .匹配除换行符外的任何字符(默认)
  • [开始字符类定义
  • ]结束字符类定义
  • |开始一个可选分支
  • (子组的开始标记
  • )子组的结束标记
  • ?作为量词,表示 0 次或 1次匹配。位于量词后面用于改变量词的贪婪特性。
  • *0次或多次匹配
  • +1次或多次匹配
  • {2}自定义匹配次数为2次,{2,}表示匹配次数不低于2次,{1,22}表示匹配次数在1-22之间

在方括号内的部分仅有以下可用元字符:

  • 转义字符
  • [^abc]表示不是a也不是b也不是c的字符
  • 0-9标记字符0-9范围内

反斜线定义的特殊字符含义:

  • d任意十进制数字
  • D任意非十进制数字
  • s任意空白字符
  • S任意非空白字符
  • w任意字母字符
  • W任意非字母字符

字符类与方括号

左方括号开始一个字符类的描述,并以右方括号结束。单独的一个右方括号没有特殊含义。
一个字符类在目标字符串中匹配一个单独的字符;该字符必须是字符类中定义的字符集合的其中一个, 除非使用了^对字符类取反。
例如:/[aeiou]/匹配所有的a, e, i, o, u,然而/[^aeiou]/匹配初他们之外的字符。
在字符类中,一个中划线(-)可以用于指定从一个字符到另一个字符的范围。 比如,/[d-m]/匹配dm之间的所有字符。

子模式与小括号
子模式通过圆括号分隔界定,并且它们可以嵌套。
子模式可以将可选分支局部化。比如,模式/cat(arcat|erpillar|)/匹配 catcataractcaterpillar 中的一个,如果没有圆括号的话,它匹配的则是cataracterpillar 以及空字符串。

重复与量词
一般的重复量词指定了一个最小数值和一个最大数值的匹配次数,通过花括号包裹两个数字,两个数字之间用逗号隔开的语法定义。 比如z{2,4}匹配zzzzzzzzz。如果第二个数字被省略,但是逗号仍然存在,就代表没有上限; 如果第二个数字和逗号都被省略,那么这个量词就限定的是一个确定次数的匹配。 比如/[a-z]{3,}/匹配至少三个连续的小写字母,但是同时也可以匹配更多,而/d{8}/只能匹配8个数字
左花括号出现在不允许使用量词的位置或者与量词语法不匹配时,被认为是一个普通字符,对它自身进行原文匹配。比如,/{,6}/就不是一个量词,会按照原文匹配四个字符{,6}

更多可以参见PCRE正则语法

原文地址:https://www.cnblogs.com/tingyugetc/p/5929447.html