PHP 正则表达式

正则表达式简介
  • 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。PHP函数查找也是一种正则表达式。
    • PHP正则就是用来模糊匹配或者精确匹配的一种手段。在现实中会经常遇到这种手段,比如去注册一个网站,你输入的用户名,网站会告诉你不合法,或者长度不够等等。这些都可以用正则表达式做到
    • 正则表达式也是网站中常用的一种技术手段,就是为了检测一些非法的,不合规的字符串所使用的。
  • 在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本模式的程序性描述
  • PHP中,正则表达式有三个作用:
    • 匹配,也常常用于从字符串中析取信息。
    • 用新文本代替匹配文本。
    • 将一个字符串拆分为一组更小的信息块。
  • 一个正则表达式中至少包含一个原子(一个内容,也就是一个匹配的东西、一个A、一个通配符、等等)。
  • 在PHP中有两套正则表达式函数库,两者功能相似,只是执行效率略有差异:
    • 一套是由PCRE(Perl Compatible Regular Expression)库提供的。使用 preg_ 为前缀命名的函数,它的效率比较高,推荐。
    • 一套由POSIX(Portable Operating System Interface of Unix )扩展提供的。使用以 ereg_ 为前缀命名的函数;
    • PCRE 来源于 Perl 语言,而 Perl 是对字符串操作功能最强大的语言之一,PHP 的最初版本就是由Perl开发的产品,后来用 C 语言重写(你需要了解下)
    • PCRE 语法支持更多特性,比 POSIX 语法更强大。
* 正则表达式的语法规则
1. 定界符
  • 在程序语言中,使用与 Perl 兼容的正则表达式,通常都需要将模式表达式放入定界符之间,如“/”。
    • 定界符可以理解为一个边界,这个边界有开始有结束。
    • 当放入这个边界之后,程序就知道了在这个边界内部,是你写的正则表达式。这就是定界符的作用。
  • 作为定界符常使用斜线 “/”,如 “/apple/” 。用户只要把需要匹配的模式内容放入定界符之间即可。作为定界的字符也不仅仅局限于 “/”。除了字母、数字和斜线 “\” 以外的任何字符都可以作为定界符,像 “#”、“|”、“!” 等都可以的。(但是都不推荐使用,只推荐“/”)
2. 原子
  • 原子是正则表达式的最基本的组成单元,而且在每个模式中最少要少包含一个原子
    • 就像我们写英文单词一样,我们26个英文字母就是一个最基本的单元,通过这些字母可以组合成所有的单词。
    • 正则表达式也一样。原子就是正则表达式最基本单元的组成单元。
    • 并且在每一个模式中,至少要包含一个原子。就像英文单词一样,最少需要一个英文字母。
  • 原子是由所有那些未显示指定为元字符的打印字符(能输出,能打印的)和非打印字符(看不见的,比如换行符等)组成,具体分为5类。
  1. 普通字符作为原子: 如 a ~ z、A ~ Z、0~9 等
  2. 一些特殊字符和转义后元字符作为原子:所有标点符号,但语句特殊意义的符号需要转义后才可作为原子,如:\” \’ * + ? . (都是通配符,需要转义后,可以输出、直接打印)等
  3. 一些非打印字符作为原子: 如:\f \n (常用) \r(常用) \t \v \cx
  4. 使用“通用字符类型”(一个表示多个)作为原子:如:\d \D \w \W \s \S。
  5. 自定义原子表([])作为原子:如:’/[apj]sp/’ ’/ [ ^apj ] sp/’

常用的非打印字符

原子字符含义描述
\cx匹配由 x 指明的控制字符。如 \cM 匹配一个 Control-M 或者回车符。x 的值必须为 A~Z 或者 a~z 之一。
\f匹配一个换页符,等价于 \x0c\cL
\n匹配一个换行符,等价于 \x0a\cJ
\r匹配一个回车符,等价于 \x0d\cM
\t匹配一个制表符,等价于 \x09\cI
\v匹配一个垂直制表符,等价于 \x0b\cK

常用的通用打印字符

原子字符含义描述
\d匹配任意一个十进制数字,等价于 [0-9]
\D匹配任意一个除十进制以外的字符,等价于 [^0-9]
\s匹配任意一个空白符,等价于 [\f\n\r\t\v]
\S匹配除空白符以外任何字符,等价于 [^\f\n\r\t\v]
\w匹配任意一个数字,字母或下s画线,等价于 [0-9a-zA-Z]
\W匹配一个数字、字母或下划线以外的任意一个字符,等价于 [^0-9a-zA-Z]
3. 元字符
元字符含义描述
*匹配0次、1次或多次其前的原子(\d\d => \d*)
+匹配1次或多次其前的原子 (和 * 基本一样,至少会有一次)
?匹配0次或1次其前的原子(要么没有,要么只有一位)
.匹配除了换行符外的任意一个字符
|匹配两个或多个分支选择(或的意思,前面写个原子,后面写个原子,两者选一)
{n}表示其前面的原子正好出现n次(举例、匹配3位的整数:\d{3})
{n,}表示其前面的原子出现不小于n次
{n,m}表示其前面的原子至少出现n次,最多出现m次(举例、3到5位字符串:\w{3,5})
^\A匹配输入字符串的开始位置(或是多行模式下行的开头,即紧随一个换行符之后:^http)
$\Z匹配输入字符串的结束位置(或是多行模式下行的结尾,即紧随一个换行符之前:com$)
\b匹配单词的边界
\B匹配除单词边界以外的部分
[]匹配方括号中指定的任意一个原子 ([abc])
[^]匹配除方括号中的原子以外的任意一个字符([^abc])
()匹配其整体为一个原子,即模式单元。可以理解为由多个单子原子组成的大原子((http))
4. 字符串边界限制
  • 在某些情况下,需要对匹配范围进行限定,以获得更准确的匹配结果。^$ 分别指定字符串的开始和结束。
  • 例如,在字符串“Tom and Jerry chased each other in the house until Tom’s uncle come in”中
    • 元字符 ^\A 置于字符串的开始确保模式匹配出现在字符串首端: /^Tom/
    • 元字符 $\Z 置于字符串的结束,确保模式匹配出现字符串尾端:/in$/
    • 如果不加边界限制元字符,将获得更多的匹配结果。
    • /^Tom$/ 精确匹配、/Tom/ 模糊匹配
5. 单词串边界限制
  • 在使用各种编辑软件的查找功能时,可以通过选择“按单词查找”获得更准确的结果。正则表达式中也提供类似的功能。
  • 例如:在字符串“This island is a beautiful land”中
    • 元字符 \b 对单词的边界进行匹配;
    • /\bis\b/ 匹配单词 “is”,不匹配 “This” 和 “island”。
    • /\bis/ 匹配单词“is”和“island”中的 “is”,不匹配 “This”。
    • 元字符 \B 对除单词边界以外的部分进行匹配。
    • /\Bis\B/ 将明确的指示不与单词的左、右边界匹配,只匹配单词的内部。所以在这个例子中没有结果。
    • /\Bis/ 匹配单词 “This” 中的 “is”。
6. 重复匹配(?*+
  • 正则表达式中有一些用于重复匹配某些原子的元字符:?*+。他们主要的区别是重复匹配的次数不同。
  • 元字符 ?:表示0次或1次匹配紧接在其前的原子。例如:/colou?r/ 匹配 “colour” 或 “color”。
  • 元字符 *:表示0次、1次或多次匹配紧接在其前的原子。例如:/zo*/ 可以匹配z、zoo。
  • 元字符+:表示1次或多次匹配紧接在其前的原子。例如:/go+gle/ 匹配“gogle”、“google”或“gooogle”等中间含有多个o的字符串。
7. 任何一个字符( . )
  • 元字符 . 匹配除换行符外任何一个字符。
    • 相当于:[^\n] (Unix系统)或[^\r\n](windows系统)。
    • 例如:/pr.y/ 可以匹配的字符串“prey”、“pray”或“pr%y”等。
  • 通常可以使用 .* 组合来匹配除换行符外的任何字符。在一些书籍中也称其为“全匹配符” 或 “单含匹配符”。
    • 例如:/^a.*z$/ 表示可以匹配字母“a”开头,字母“z”结束的任意不包括换行符的字符串。
    • /.+/ 也可以完成类似的匹配功能所不同的是其至少匹配一个字符。
    • /^a.+z$/ 匹配“a%z”不匹配字符串“az”。
8. 重复匹配({}
  • 元字符 { } 准确地指定原子重复的次数,指定所匹配的原子出现的次数。
    • {m} 表示其前原子恰好出现m次。
    • {m,n} 表示其前原子至少出现m次,至多出现n次。
    • {m,} 表示其前原子出现不少于m次。
  • 举例说明:
    • /zo{1,3}m/ 只能匹配字符串“zom”、“zoom”、或“zooom”。
    • /zo{3}m/ 只能匹配字符串“zooom”。
    • /zo{3,}m/ 可以匹配以 “z” 开头,“m”结束,中间至少3个“o”的字符串
    • /bo{0,1}u/ 可以匹配字符串“bought a butter” 中的“bou”和“bu”,等价于bo?u。
9. 原子表([-]
  • 原子表 [-] 用于连接一组按ASCII码顺序排列的原子,简化书写。
  • 举例说明:
    • /x[0123456789]/ 可以写成 x[0-9],用来匹配一个由 “x” 字母与一个数字组成的字符串。
    • /[a-zA-Z]/ 匹配所有大小写字母
    • /^[a-z][0-9]$/ 匹配比如“z2”、 “t6” 、“g7”
    • /0[xX][0-9a-fA-F]/ 匹配一个简单的十六进制数字,如“0x9”。
    • /[^0-9a-zA-Z_]/ 匹配除英文字母、数字和下划线以外任何一个字符,其等价于 \W
    • /0?[ xX][0-9a-fA-F]+/ 匹配十六进制数字,可以匹配“0x9B3C”或者“X800”等。
    • /<[A-Za-z][A-Za-z0-9]*>/ 可以匹配<p><h1><body> 等。
10. 模式选择符(|
  • 元字符 | 又称模式选择符。在正则表达式中匹配两个或更多的选择之一。
  • 在字符串“There are many apples and pears.”中,/apple|pear/ 在第一次运行时匹配“apple”;
  • 再次运行时匹配“ pear”。也可以继续增加选项,如:/apple|pear|banana|lemon/
11. 模式单元(()
  • 待更新
与 Perl 兼容的正则表达式函数
  • 待更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值