![零基础PHP学习笔记](https://wfqqreader-1252317822.image.myqcloud.com/cover/195/36710195/b_36710195.jpg)
4.3 正则表达式
4.3.1 正则表达式简介
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/40266-00-101-01.jpg?sign=1739554342-i78YdcSDG9TBc63VPpTCxKOGlgp5wahV-0-d92fcce62bdbbb87e40fab9b78874a52)
在编写处理字符串的程序或网页时,经常会查找符合某些复杂规则的字符串。正则表达式就是用于描述这些规则的工具。换言之,正则表达式就是记录文本规则的代码。对接触过DOS的用户来说,如果想匹配当前文件夹下的所有文本文件,则可以输入“dir *.txt”命令,按<Enter>键后所有“.txt”文件将会被列出来。这里的“*.txt”即可理解为一个简单的正则表达式。
4.3.2 行定位符
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/40266-00-101-02.jpg?sign=1739554342-hHAtvGpTzrjXw73PNuRjn44fGaNVPJNE-0-89fb3b0345452aa7603d463db1b34aa8)
行定位符用来描述字符串的边界。“^”表示行的开始;“$”表示行的结尾。例如:
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/101-3.jpg?sign=1739554342-mVCWGGnrf7FvSXTKX7dzdmu4ZkSzuogh-0-fe109357ee83cf5ac52ef5942a93284c)
该表达式表示要匹配字符串tm的开始位置是行头,如tm equal Tomorrow Moon就可以匹配,而Tomorrow Moon equal tm则不匹配。如果使用:
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/102-1.jpg?sign=1739554342-cwCnkNtb96Jo25Yf1iRDATEzHh74NGKA-0-9643be870df813e33d06e5d437fa3010)
则后者可以匹配而前者不能匹配。如果要匹配的字符串可以出现在字符串的任意部分,那么可以直接写成:
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/102-2.jpg?sign=1739554342-1cncpkWAkQkIEvtetffosjG3FXZsUyzg-0-e616b4db6914d05c0fc1ce335ea2e4f9)
这样两个字符串就都可以匹配了。
4.3.3 元字符
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/40266-00-102-01.jpg?sign=1739554342-TRdTdU0wK5GQSsyPfbchNea5x1iO4Icn-0-318cafe1c6ac211334f2a2eb57de6815)
现在你已经知道几个很有用的元字符了,如“^”“$”。正则表达式里还有很多元字符,下面来看看元字符的示例:
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/102-3.jpg?sign=1739554342-iBOeyglFqOYu92ZRjDyYS6GHB25odxhZ-0-7e86ca462404f2535723e0e001ba7958)
匹配以字母“mr”开头的单词,首先从某个单词开始处(\b)匹配字母“mr”,接着是任意数量的字母或数字(\w*),最后是单词结束处(\b)。该表达式可以匹配“mrsoft”“mrbook”“mr123456”等。常用的元字符如表4.2所示。
表4.2 常用的元字符
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/102-4.jpg?sign=1739554342-lI1ovBqrkbIv4uYo5Y13eJunoKEjYbyV-0-64ad8e6d1eaa2dc76bae6949b4711d87)
4.3.4 限定符
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/40266-00-102-02.jpg?sign=1739554342-6y5URVILz8yeakzh244cXFzgj1deseKo-0-9087074631d8b9cd802545f068215717)
在前面章节的例子中,使用(\w*)匹配任意数量的字母或数字。如果想匹配特定数量的数字,那么该如何表示呢?正则表达式提供了限定符(指定数量的字符)来实现该功能。如匹配8位QQ号可用如下表示式:
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/102-5.jpg?sign=1739554342-lK9zJfYEqOtrvYmut8eHkcQLGcWOI2HD-0-95ca5a9533d5ea1b369f5a56ee5b497a)
常用的限定符如表4.3所示。
表4.3 常用的限定符
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/103-1.jpg?sign=1739554342-C6yAwFseer8YtOQB59D9FoznE8CrvHOV-0-6eeef15616c79f042632e3c963758e7c)
4.3.5 字符类
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/40266-00-103-01.jpg?sign=1739554342-NXTiNx9erq94XWv0EyhKez2FyN6wuc1z-0-14ad7b28b2638814d9bfb91a259b0dbd)
用正则表达式查找数字和字母是很简单的,因为已经有了对应这些字符集合的元字符(如\d,\w),如果要匹配没有预定义元字符的字符集合(比如元音字母a、e、i、o、u),应该怎么办?很简单,只需要在方括号里列出它们就可以了,比如[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(. 或 ? 或 !)。也可以轻松地指定一个字符范围,比如[0-9]的含意与\d就是完全一致的,即一位数字;同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文)。
4.3.6 排除字符
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/40266-00-103-02.jpg?sign=1739554342-kPjFcBua6Lm6XjmHQuPjdSYjjsnCEBnO-0-67fe16bd8f6a94b018162f28906e0b67)
前面的例子是匹配符合命名规则的变量。现在反过来,匹配不符合命名规则的变量,正则表达式提供了“^”元字符,这个元字符在4.3.1节中出现过,表示行的开始,而在这里将会把这个元字符放到方括号中,表示排除。例如:
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/103-2.jpg?sign=1739554342-m0utfQ4K7fthFRTBEFYRqesUwXA9wVW6-0-268e90a878b040c64eb8f8dc7d796462)
该表达式匹配的就是不以字母开头的变量名。
4.3.7 选择字符
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/40266-00-103-03.jpg?sign=1739554342-13L5DUNtURqAjvXiYqeh05BxJVhUnhwK-0-4d88105407915b959de9ed9cdd8f2008)
试想一下,如何匹配身份证号码?首先需要了解一下身份证号码的规则。身份证号码的长度为15位或18位。如果为15位时,则全为数字;如果为18位时,则前17位为数字,最后一位是校验位,可能为数字或字符X。
在前面的描述中,包含着条件选择的逻辑,这就需要使用选择字符(|)来实现。该字符可以理解为“或”,匹配身份证的表达式可以写成如下方式:
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/103-3.jpg?sign=1739554342-BpwfBOKOsfwiFe9LUr2sRVZPFy4VFnUK-0-9f6f83c8b57e0f50485de93535a26e14)
该表达式的意思是匹配15位数字或者18位数字,或者17位数字和最后一位。最后一位可以是数字或是X也或是x。
4.3.8 转义字符
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/40266-00-104-01.jpg?sign=1739554342-3YhLfmj0RNUKEWnG4x07KlKKsV2qUN2C-0-1f10a49ff79883310cf1e3a39dc01dde)
正则表达式中的转义字符(\)和PHP中的大同小异,都是将特殊字符(如“.”“?”“\”等)变为普通字符。列举一个IP地址的实例,用正则表达式匹配诸如127.0.0.1这种格式的IP地址。如果直接使用点字符,则格式为:
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/104-1.jpg?sign=1739554342-Dg3PQPX42AsoRgav13E2DgiivCfv7I6E-0-53d379f180c3dfe92d126f5c5d6a602f)
这显然不对,因为“.”可以匹配一个任意字符。这时,不仅是127.0.0.1这种格式的IP,连127101011这样的字符串也会被匹配出来。所以在使用“.”时,需要使用转义字符(\)。修改后上面的正则表达式的格式为:
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/104-2.jpg?sign=1739554342-CVadMVtdsqi1mFJRl1iG4oBRMRIcTrv5-0-943945be5789808c0c7513a5edd14f59)
学习笔记
括号在正则表达式中也算是一个元字符。
4.3.9 分组
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/40266-00-104-02.jpg?sign=1739554342-LbdUmfYEt9KBAhf8zNaKlxYZm28jLqya-0-2c57a25c5cc08042f969f73ef0e17781)
通过4.3.8节中的例子,相信读者已经对小括号的作用有了一定的了解。小括号的第一个作用就是可以改变限定符的作用范围,如“|”“*”“^”等。来看下面的一个表达式:
![](https://epubservercos.yuewen.com/7E78CA/19471983208811306/epubprivate/OEBPS/Images/104-3.jpg?sign=1739554342-hO4XEe8qEmImwLiggnqImcJuub13zytm-0-4bc0819f90d55ca43e2dd2c9c5532dc6)
这个表达式的意思是匹配单词thirth或fourth,如果不使用小括号,那么就变成了匹配单词thir和fourth了。
小括号的第二个作用是分组,也就是子表达式,如(\.[0-9]{1,3}){3},就是对分组(\.[0-9]{1,3})进行重复操作。