zl程序教程

您现在的位置是:首页 >  前端

当前栏目

(独孤九剑)--正则表达式

2023-09-11 14:19:07 时间

【一】适用场景

邮箱验证,手机号码,验证码,替换敏感词(骂人换成**),文档采集,表情替换技术(早期),模板引擎解析

 

【二】定界符

定界符就是用来定义边界

注意:定界符不能用a-zA-Z0-9和 \和(),其他都可以用,但必须成对出现,又开始有结束

区分 \ 和 /,\ 为转义字符, / 为正则字符

转义字符:将 / 转为字符串形式,因为例如$str = '/ / /'这种形式的正则无法识别中间的/,所以需要 \ 转义字符,将中间的 / 转义为符号才能使用。

例如需要正则匹配 \ 时:

$str = '/ \/ /';
或者
$str = "/ '/' /";
或者修改定界符
$str = "@ / @"

定界符写法举例:

<?php
    $str = '% %';
    $str = '^ ^';
    $str = '$ $';
    $str = '/ /';
    $str = '@ @';
$str = '# #';
$str = '( )';//错误 $str = 'A A';//错误 ?>

最常用的为/

 

【三】元字符

^,\d及$等符号代表了特定的匹配意义,我们称之为元字符,常见元字符有

.       除换行符外任意字符;

\w    a-zA-Z0-9(字母或数字、下划线);-----word字母

\s     空白符\n,\t,\r,空格;-----------------spacing间隙

        空白符是指空格符' '、水平制表符'\t'、垂直制表符'\v'、换行符'\n'、回车符'\r'、换页符'\f'之类的字符

\d    0-9数字;---------------------------digit数字

\b    词边界(单词的开始或结束);---------begin开始

^     字符串开始;

$     字符串结束;

[x]   匹配x字符,如匹配字符串里的a,b,c字符;

\W   \w的转义,除了a-zA-Z0-9之外的任意字符;

\S   匹配任何非空白的字符;

\D   0-9以外,匹配任何的字符;

\B   非边界(匹配不是单词开头或结束位置的字符);

[^x] 匹配除了x以外任意字符,如[^abc]匹配除了abc以外任意字符

      例如:[^0-9a-zA-Z]中因为有抑扬符,所以变成了匹配0-9a-zA-Z之外的字符

注意:

①当我们要匹配这些元字符的时候,我们需要用到字符转义功能,同样正则表达式里面用 \ 来表示转义,如要匹配 . 符号,则需要用 \. ,否则 . 会被解释成“除换行符外的任意字符”。当然,要匹配 \ ,则需要写成 \\
②连续的数字或字母可以用 – 符号连接起来,如 匹配所有的小写字母,[1-5] 匹配 1 至 5 这 5 个数字

 

【四】正则表达式中的原子(最小单位)

原子是正则表达式的最小单位,一个成立的正则表达式必须至少包含一个原子

包含:空格,a-zAZ,换行,0-9,中文,标点符号,特殊符号等全为原子

原子等价式:

\d      0-9
\w     a-zA-Z0-9
\s      \t,\n,\v,\r,空格
\D     [^0-9]
\W    [^a-zA-Z0-9]
\S     [^\t\n\f\r]

 

【五】循环字符

正则表达式用一些重复规则来表达循环匹配

常用的重复如下:

*           重复0次或更多次;

+          重复1次或更多次;

?        重复0次或1次;

{n}       有且只能重复n次;

{n,}      至少重复n次;

{n,m}   可以重复n到m次;

<?php
    if (preg_match("/\w?/", "2kkk6k3",$match)) {//匹配0或1次,所以会输出2
        print_r($match);
    }else{
        print_r("匹配失败");
    }
?>

 

【六】正则函数

  preg_match() 第一次匹配成功后就会停止匹配,如果要实现全部结果的匹配,即搜索到subject结尾处,则需使用 preg_match_all() 函数

(1)php匹配正则函数:preg_match()

preg_match() 函数用于进行正则表达式匹配,成功返回 1 true,否则返回 0 false。
preg_match() 匹配成功一次后就会停止匹配,如果要实现全部结果的匹配,则需使用preg_match_all() 函数。

 语法:preg_match(正则表达式,匹配变量,存储匹配结果的数组)

<?php
    if (preg_match("/IT/i", "hiTony",$match)) {
        print_r($match);//输出匹配结果
    }else{
        print_r("匹配失败");
    }
?>

 (2)preg_match_all()

preg_match_all() 函数用于进行正则表达式全局匹配,成功返回整个模式匹配的次数(可能为零),如果出错返回 FALSE

 

【七】模式修正符

模式修正符是标记在整个正则表达式之外的,可以看着是对正则表达式的一些补充说明

常用的模式修正符如下:

i          模式中的字符将同时匹配大小写字母

if (preg_match("/ABC/i", "abc",$match)) {
        print_r($match);
    }else{
        print_r("匹配失败");
    }

m       字符串视为多行


s        将字符串视为单行,换行符作为普通字符
x        将模式中的空白忽略
e        preg_replace() 函数在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。
A       强制仅从目标字符串的开头开始匹配
D       模式中的 $ 元字符仅匹配目标字符串的结尾
U       匹配最近的字符串
u       模式字符串被当成 UTF-8

 

【八】或者(分枝)

分枝是指制定几个规则,如果满足任意一种规则,则都当作匹配成功。具体来说就是用 | 符号把各种规则分开,且条件从左至右匹配。

提示:分枝规定,只要匹配成功,就不再对后面的条件加以匹配,所以如果你想匹配有包含关系的内容,请注意规则的顺序。

下面是一个使用分枝的例子。

美国的邮政编码的规则是 5 个数字或者 5 个数字连上 4 个数字,如 12345 或者 54321-1234 ,如果要匹配所有的邮编,则正确的正则表达式为:

\d{5}-\d{4}|\d{5}

 

【九】常用正则

邮箱,手机号,网址,自定义格式,采集器

 

【十】正则练习

(1)必须以start开始,以end结束,中间有一个或更多数字

<?php
    $pattern = '/^start\d+end$/';
    $string1 = "start666end";
    if (preg_match($pattern,$string1,$match)) {
        print_r($match);
    }else{
        print_r("匹配失败");
    }
?>

(2)必须以end结束

$pattern = '/start\d+end$/';

(3)必须以start开始

$pattern = '/^start\d+end/';

(4)匹配非数字,即字母。以字母开始以字母结束(只能匹配一个)

$pattern = '/^[^0-9]$/';
$string1 = "a";
//匹配成功

(5)匹配非数字,即字母。以字母开始以字母结束(能匹配多个)

$pattern = '/^[^0-9]+$/';
$string1 = "abc";
//匹配成功