站长学院
CMS建站教程 SEO优化攻略
来源:齐鲁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、写一个采集器