2021-10-18

让人心动的PHP的正则表达式基础(图例详解)

在之前的文章中给大家带来了《学会使用PHP的List、each函数及配合》,主要讲解了应该如何使用list函数和each函数以及两者之间应该怎样配合使用,相信大家已经掌握的差不多了,那么本篇文章我们一起来看一看PHP中的正则表达式。希望对大家有帮助!

正则表达式准确来讲是对字符串进行操作的一种逻辑公式,也就是用一开始定义好的一些特定的字符还有这些特定字符的组合,组成了一个“规则字符串”,这个“规则字符串”其实就是用来过滤字符串的。可以理解为我们在登陆用户的时候有时会要填写验证码或者电话之类的这些特定的数据,这时候就要用到正则表达式。

正则表达式虽然看起来复杂,其实并不难,那接下来我们一起来看一看吧。

正则表达式的定界符

首先我们要学习的就是正则表达式的定界符,顾名思义,定界符就是确定正则表达式边界的符号,定一个边界,边界以内就是正则表达式。同时正则表达式的定界符有规定:

  • 定界符,不能使用a-zA-Z0-9/ 除此以外都可以使用。并且必须成对出现,有开始就有结束。

示例如下:

$正则表达式$
%正则表达式%
/正则表达式/

其中我们需要注意的是/是转义字符,当我们正则中需要匹配/的时候,可以使用/转义一下。如果觉得麻烦的话,可以直接使用其他的定界符比如:

$/$

正则表达式的原子

正则表达式的原子是正则表达式里的最小单位,也就是我们需要匹配的内容,在我们成立的整形额表达式中,最少也要有一个原子。

其实可以理解为,所有可见的不可见的字符都是原子,比如空格、回车、换行、0-9、标点符号、A-Za-z、中文这些都是原子。

preg_match() 函数

在详细的讲原子之前,我们要先了解一下一个函数,那就是preg_match

PHP 中的 preg_match() 函数可以根据定义的正则表达式对字符串进行搜索以及匹配。

语法格式如下:

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

根据$正则也就是我们定义的正则表达式,在匹配$字符串,如果存在则返回匹配个数,然后把匹配的结果放在$结果里。如果没有匹配到结果那就返回0。

我们通过示例来看一下:

<?php
//定义一个变量叫a,作为我们定义的正则表达式。
$a = '/a/';
$b = 'abbcccddddeeeee';
if(preg_match($a, $b, $c)){
   echo '匹配到了,结果为:';
   var_dump($c);
}else{
   echo '没有匹配到';
}
?>

输出结果:

1018.09.png

由上述示例可以看出,我们定义了变量a,希望能够匹配的是a,正好在$b中存在a,通过if else语句输出成功了。

再来一个示例:

<?php
//定义一个变量叫a,作为我们定义的正则表达式。
$a = '/fff/';
$b = 'abbcccddddeeeee';
if(preg_match($a, $b, $c)){
   echo '匹配到了,结果为:';
   var_dump($c);
}else{
   echo '没有匹配到';
}
?>

输出结果:

1018.11.png

上述示例中,希望匹配到字符串,但是$b中不存在,所以没有匹配成功,通过if else语句输出为匹配成功。

知道了preg_match() 函数的基本用法之后我们可以和特殊标识的原子结合起来使用。

特殊标识的原子

  • /d—匹配一个0-9

  • /D—除了0-9以外的所有字符

  • /w—a-zA-Z0-9_

  • /W-–除了0-9A-Za-z_以外的所有字符

  • /s—匹配所有空白字符/n /t /r 空格

  • /S—匹配所有非空白字符

  • [ ]—指定范围的原子

它们的具体用法给大家举个例子就明白了:

<?php
$a = '//d/';
$b = '人生自古谁无4';
if(preg_match($a, $b, $c)){
   echo '匹配到了,结果为:';
   var_dump($c);
}else{
   echo '没有匹配到';
}
?>

输出结果:

1018.12.png

在上述示例中,特殊标识的原子/d表示的就是0-9的数字,那么在需要匹配的$b中存在一个4,所以匹配成功。

<?php
$a = '//w/';
$b = '人生自古谁无死';
if(preg_match($a, $b, $c)){
   echo '匹配到了,结果为:';
   var_dump($c);
}else{
   echo '没有匹配到';
}
?>

输出结果:

1018.13.png

在上述实例中,特殊标识的原子/w表示的是a-zA-Z0-9_ ,在变量b中没有相应的元素,所以输出结果为未匹配到。

其中还有一个[^]字符表示不匹配指定区间的字符。

示例如下:

<?php
$a = '/[^0-9A-Za-z_]/';
$b = 'abbccc122333';
if(preg_match($a, $b, $c)){
   echo '匹配到了,结果为:';
   var_dump($c);
}else{
   echo '没有匹配到';
}
?>

输出结果:

1018.14.png

通过[^]字符匹配除0-9A-Za-z_以外的字符,未匹配到。

总结一下:

  • /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次,最大次数不限制

  • ()—改变优先级或者将某个字符串视为一个整体,匹配到的数据取出来也可以使用它

接下来我们通过一些例子来实例看一下这些元字符的使用:

<?php
$a = '//d+/';
$b = "爱你10000年";
if(preg_match($a, $b, $c)){
   echo '匹配到了,结果为:';
   var_dump($c);
}else{
   echo '没有匹配到';
}
?>

输出结果:

1018.15.png

通过元字符+的添加,匹配到了多次字符,/d+中d是匹配数字,+则表示最少匹配一次前面的字符。

正则表达式的模式修正符

通过原子和元字符的了解,我们已经完成了正则表达式的入门,但是这仍然不能代表正则表达式的真正实力,如果我们只希望正则表达式匹配一部分应该怎么办?有些特殊情况依然需要处理,这时候我们就要用到正则表达式的模式修正符。

下面列举一些常用的模式修正符:

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

  • m 字符串视为多行

  • s 将字符串视为单行,换行符作为普通字符.

  • x 将模式中的空白忽略.

  • A 强制仅从目标字符串的开头开始匹配.

  • D 模式中的美元元字符仅匹配目标字符串的结尾.

  • U 匹配最近的字符串.

它的用法如下:

/正则表达式/模式修正符

接下来我们通过一些实例来看一下它的使用:

<?php  
    $a = '/ABC/i'; 
$b = '8988abc12313';
$c = '11111ABC2222'; 
if(preg_match($a, $b, $d)){
     echo '匹配到了,结果为:'; 
    var_dump($d); }else{
     echo '没有匹配到';
     }
 ?>

输出结果:

1018.16.png

i可以让匹配的时候同时匹配大小写,那么接下来把匹配的$b换成$c试一下,我们看一下输出结果:

<?php  
    $a = '/ABC/i'; 
$b = '8988abc12313';
$c = '11111ABC2222'; 
if(preg_match($a, $c, $d)){
     echo '匹配到了,结果为:'; 
    var_dump($d); }else{
     echo '没有匹配到';
     }
 ?>

输出结果:

1018.17.png

推荐学习:《PHP视频教程

以上就是让人心动的PHP的正则表达式基础(图例详解)的详细内容,更多请关注php中文网其它相关文章!

php中文网最新课程二维码

声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理

  • 相关标签:PHP 正则表达式
  • https://www.php.cn/php-weizijiaocheng-483120.html

    发表回复

    Your email address will not be published. Required fields are marked *