三、正则表达式

3.1 正则定义

使用方法 preg_match($p, $str) 进行正则匹配匹配上返回true,否则返回false

3.2 正则表达式的基本语法

PCRE库中正则匹配使用分隔符与元字符组成,分隔符可以撒非数字非反斜线非空格的任意字符。

经常使用的分隔符是正斜线(/)、hash符号(#)以及取反符号(~)

若模式中包含分割符号,则需要使用反斜杠()进行转义

若模式中包含较多分隔符,建议更换其他字符作为分隔符,也可以采用preg_quote进行转义

分割符后面合一使用模式修饰符,模式修饰符包括:i,m,s,x

i    正则匹配是不区分大小写
m    将字符串视为多行。默认正则开始“^”和结束“$”将目标字符串作为一行(包含里面的换行符),加上改修饰符将指定每一行开始都是“^”结束都是“$”
s    设定了次修饰符,被匹配的字符串将视为一行来看,包括换行符,换行符将被视为普通字符串
x    忽略空白,除非进行转义的不会被忽略
e    只用在preg_replace()函数中,在替换字符串中逆向引用做正常的替换,将其(即“替换字符串”)作为PHP代码求值,并用其结果来替换所搜索的字符串。    
A    如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说”/a/A”匹配”abcd”。    
D    模式中的$字符权匹配目标字符的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前。如果设定了修正符m则忽略此项。    
E    与”m”相反,如果使用这个修饰符,那么”$”将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。    
U    贪婪模式,和问号的作用差不多,最大限度的匹配就是贪婪模式。

3.3 元字符与转义

正则表达式中具有特殊含义的字符称为元字符,常用元字符:

\    一般用于转义字符
^    断言目标的开始位置(多行模式下是行首)
$    断言目标的结束位置(多行模式下是行尾)
.    匹配除换行符外的任意字符
[    开始字符类定义
]    结束字符类定义
|    开始一个可选分支(和逻辑运算或是一样的)
(    子组的开始标记
)    子组的结束标记
?    作为量词,表示匹配0或1次
*    量词,表示匹配0次或多次
+    量词,表示匹配1次或多次
{    自定义量词开始标记
}    自定义量词结束标记

3.4 贪婪模式与懒惰模式

贪婪模式:在可匹配与可不匹配的时候优先匹配

//下面的\d表示匹配数字
$p = '/\d+\-\d+/';
$str = "我的电话是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //结果为:010-12345678

懒惰模式:

在可匹配与可不匹配的时候,优先不匹配

$p = '/\d?\-\d?/';
$str = "我的电话是010-12345678";
preg_match($p, $str, $match);
echo $match[0];  //结果为:0-1

3.5 使用正则表达式进行匹配

使用方法 preg_match($p, $str) 进行正则匹配匹配上返回true,否则返回false

3.6 查找所有匹配结果

preg_match只能匹配一次结果,但很多时候我们需要匹配所有的结果,preg_match_all可以循环获取一个列表的匹配结果数组。

3.7 正则表达式的搜索和替换

通过正则搜索与替换可以调整目标字符串格式,改变字符串中匹配字符串的顺序等

例:

$string = 'April 15, 2014';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '$3, ${1} $2';
echo preg_replace($pattern, $replacement, $string); //结果为:2014, April 15

以上例子中通过小括号进行匹配内容的分组,$1表示第一个匹配到的字符串, ${1}$1是等效的。

3.8 正则匹配常用案例

匹配数字字母与下划线:/^\w+$/i
匹配邮箱格式:/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/
匹配手机号:/^(0|86|17951)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57])[0-9]{8}$/
匹配中文字符:/[\u4e00-\u9fa5]/gm
匹配身份证号:/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/
匹配双字节字符:/[^\x00-\xff]/igm
匹配行首行位空白:/(^\s*)|(\s*$)/
匹配url地址:/^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i
匹配邮编:/^[1-9]\d{5}(?!\d)$/
匹配日期:/^[1-2][0-9][0-9][0-9]-[0-1]{0,1}[0-9]-[0-3]{0,1}[0-9]$/
最后修改:2019 年 03 月 11 日
如果觉得我的文章对你有用,请随意赞赏