15621857753

详解PHP正则表达式 原来正则也没那么难

来源:齐鲁CMS 栏目:PHP 阅读: 日期:2022-12-08

世界上最难看得懂是道师的鬼符、医师的药方和程序员的正则表达示。匹配电子邮箱、手机号、安全验证更换敏感核心关键词。文章伪原创。初期的表情更换技术,ubb文件编码、markdown编辑软件更换等,以后自己写模板引擎也需要使用正则表达示。通过一点一滴来去学习与掌握正则表达示需要具备的基本技能。

一、定界符

定界符,就是定一个边界,边界已内的就是正则表达式

定界符,不能用a-zA-Z0-9\ 其他的都可以用。必须成对出现,有开始就有结束

几个例子:

例子 说明
/中间写正则/ 正确
$中间写正则$ 正确
%中间写正则% 正确
^中间写正则^ 正确
@中间写正则@ 正确
(中间写正则) 错误
A中间写正则A 错误

注:\ 是转义字符,如果在以后正则表达示里面需要匹配/,如下

/ / /

这个时候真要匹配/ 的时候,需要把定界符里面的/ 用转义字符转义一下,写成下面的样子

/ \/ /

要觉得麻烦,遇到这种需要转义的字符的时候可以把两个正斜线(/ /)定界,改为其他的定界符(# #)

二、原子和函数

1)原子是正则表达示里面的最小单位,原子说白了就是需要匹配的内容

一个成立的正则表达示当中必须最少要有一个原子

所有可见不可见的字符就是原子:空格、回车、换行、0-9、A-Za-z、中文、标点符号、特殊符号

2)preg_match:执行正则表达式的函数

int preg_match ( string $正则 , string $字符串 [, array &$结果] )

功能:根据$正则变量,匹配$字符串变量。如果存在则返回匹配的个数,把匹配到的结果放到$结果变量里。如果没有匹配到结果返回0

代码演示:

$zz='/a/';
$string='ddfdjjvi2jfvkwkfi24';
if (preg_match($zz,$string,$matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
    echo '没有找到';
}

输出:没有找到   (因为$string里面没有a)

3)特别标识的原子(默写级别)

原子 说明
\d 匹配一个0-9
\D 除了0-9以外的所有字符
\w a-zA-Z0-9_
\W 除了0-9A-Za-z_以外的所有字符
\s 匹配所有空白字符\n \t \r 空格
\S 匹配所有非空白字符
[ ] 指定范围的原子
[^ ] 不匹配指定区间的字符

等价如下:

原子 等价式
\w [a-zA-Z0-9_]
\W [^a-zA-Z0-9_]
\d [0-9]
\D [^0-9]
\s [ \t\n\f\r]
\S [^ \t\n\f\r]

三、元字符

使用原子时,只能够匹配一个字符,匹配多个字符就出现了问题

借助元字符来帮我们修饰原子,可以实现更多的功能

元字符 功能说明
* 是代表匹配前面的一个原子,匹配0次或者任意多次前面的字符。
+ 匹配一次或多前前面的一个字符
? 前面的字符可有可无【可选】 有或没有
. 更标准一些应该把点算作原子。匹配除了\n以外的所有字符
  或者。注:它的优先级最低了。
^ 必须要以抑扬符之后的字符串开始
$ 必须要以$之前的字符结尾
\b 词边界
\B 非边界
{m} 有且只能出现m次
{n,m} 可以出现n到m次
{m,} 至少m次,最大次数不限制
() 改变优先级或者将某个字符串视为一个整体,匹配到的数据取出来也可以使用它

四、模式修正符

模式匹配符 功能
i 模式中的字符将同时匹配大小写字母.
m 字符串视为多行
s 将字符串视为单行,换行符作为普通字符.
x 将模式中的空白忽略.
A 强制仅从目标字符串的开头开始匹配.
D 模式中的美元元字符仅匹配目标字符串的结尾.
U 匹配最近的字符串.

用法如下:

/ 正则表达示/模式匹配符

代码举例:

/\w+/s

应用举例:

i 不区分大小写

//在后面加上了一个i 
$pattern = '/ABC/i';
$string = '8988abc12313';
$string1 = '11111ABC2222';
if(preg_match($pattern, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches); }else{
    echo '没有匹配到';
}

e 将匹配项找出来,进行替换

e模式也叫逆向引用,将正则表达式括号里的内容取出来,放到替换项里面替换原字符串

使用函数:preg_replace()

mixed preg_replace ( mixed $正则匹配项 , mixed $替换项 , mixed $查找字符串)

功能:使用$正则匹配项变,找到$查找字符串变量。然后用$替换项变量进行替换

举例:

$string = "{April 15, 2003}";

//'w'匹配字母,数字和下划线,'d'匹配0-99数字,'+'元字符规定其前导字符必须在目标对象中连续出现一次或多次
$pattern = "/{(\w+) (\d+), (\d+)}/i";

$replacement = "\$2";

//字符串被替换为与第 n 个被捕获的括号内的子模式所匹配的文本
echo preg_replace($pattern, $replacement, $string);

五、诀窍

写一点测一点,不断的正则,用preg_match对比是不是能匹配成功

成功了,再写后面的一点,直到写完,全部匹配成功为止

例如写一个邮箱的正则,先将常用的邮箱格式全部列出来  

phpcn@php.cn
phpcn@corp.baidu.cm
phpcn@126.com
phpcn@xxx.com
12345@qq.com  

常用的格式主要有这样一些

那我们就可以来分析:  

1.先匹配@之前的字符\w+(因为是0-9A-Za-z_)  

2.第二个跟一个@符  

3.第三个再写上[a-zA-Z0-9-]+因为qq和126这些主域名是不能有下划线的  

4.corp.baidu.或者是126.通常邮箱后缀都是这样的。所以我们可以写成:([a-zA-Z0-9-]+.){1,2}  

5.上面的是将.转义,让它是本身的意思。括号重复的区间最少一次,最多两次。  

6.后面接下com|cn|org|gov.cn|net|edu.cn等就可以了  

因此,邮箱的正则表达式就是:  

/\w+@([a-zA-Z0-9-]+.){1,2}(com|cn|org|gov.cn|net|edu.cn)/  

邮箱的正则就被我写成功了。

六、常用正则函数

函数名 功能
preg_filter 执行一个正则表达式搜索和替换
preg_grep 返回匹配模式的数组条目
preg_match 执行一个正则表达式匹配
preg_match_all 执行一个全局正则表达式匹配
preg_replace_callback_array 传入数组,执行一个正则表达式搜索和替换使用回调
preg_replace_callback 执行一个正则表达式搜索并且使用一个回调进行替换
preg_replace 执行一个正则表达式的搜索和替换
preg_split 通过一个正则表达式分隔字符串

七、面试常遇到的问题

1、匹配邮箱  

2、匹配手机号  

3、匹配一个网址  

4、用正则匹配某个格式,取出某个例  

5、写一个采集器