RegExp

PHP 中的正则表达式

  1. 正则表达式简介
    1.1 什么是正则
    ① /^[0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+(.[0-9a-zA-Z_-]+){0,3}$/ 就是正则
    ② 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。
    到目前为止,我们前面所用过的精确(文本)匹配也是一种正则表达式。
    ③ 在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本模式的程序性描述。

    1.2 正则表达式的作用
    ① 匹配,也常常用于从字符串中析取信息。
    ② 用新文本代替匹配文本。
    ③ 将一个字符串拆分为一组更小的信息块。

    1.3 学习正则的流程
    ① 语法学习
    ② 函数学习

    1.4 正则的故事
    ① 在PHP中有两套正则表达式函数库,两者功能相似,只是执行效率略有差异:
    一套是由PCRE(Perl Compatible Regular Expression)库提供的。使用“preg_”为前缀命名的函数;
    一套由POSIX(Portable Operating System Interface of Unix )扩展提供的。使用以“ereg_”为前缀命名的函数;
    ② PCRE来源于Perl语言,而Perl是对字符串操作功能最强大的语言之一,PHP的最初版本就是由Perl开发的产品。
    ③ PCRE语法支持更多特性,比POSIX语法更强大。

  2. 正则表达式的语法规则
    2.1 定界符
    在程序语言中,使用与Perl兼容的正则表达式,通常都需要将模式表达式放入定界符之间,如“/”。
    作为定界的字符也不仅仅局限于“/”。除了字母、数字和斜线“\”以外的任何字符都可以作为定界符,像 ‘#’、’|’、’!’ 等都可以的。

    2.2 原子
    1. 普通字符作为原子: 如 a~z、A~Z、0~9 等
    2. 一些特殊字符和转义后元字符作为原子:
    所有标点符号,但语句特殊意义的符号需要转义后才可作为原子,如:\” \’ * + \? . 等
    3. 一些非打印字符作为原子: 如:\f \n \r \t \v \cx
    原子字符 含义描述
    \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
    4. 使用“通用字符类型”作为原子:如:\d \D \w \W \s \S。
    原子字符 含义描述
    \d 匹配任意一个十进制数字,等价于[0-9]
    \D 匹配任意一个除十进制数字以外的字符,等价于[^0-9]
    \s 匹配任意一个空白符,等价于[\f\n\r\t\v]
    \S 匹配除空白符以外任何字符,等价于[^\f\n\r\t\v]
    \w 匹配任意一个数字、字母或下画线,等价于[0-9a-zA-Z_]
    \W 匹配一个除数字、字母或下画线以外的任意一个字符,等价于[^0-9a-zA-Z_]
    5. 自定义原子表([])作为原子:如:’/[apj]sp/’ ’/[^apj]sp/’ [] [^]

    2.3 元字符
    元字符 含义描述
    * 匹配0次、1次或多次其前的原子
    + 匹配1次或多次其前的原子
    ? 匹配0次或1次其前的原子
    . 匹配除了换行符外的任意一个字符
    | 匹配两个或多个分支选择
    {n} 表示其前面的原子恰好出现n次
    {n,} 表示其前面的原子出现不小于n次
    {n,m} 表示其前面的原子至少出现n次,最多出现m次
    ^或\A 匹配输入字符串的开始位置(或在多行模式下行的开头,即紧随一个换行符之后)
    $或\Z 匹配输入字符串的结束位置(或在多行模式下行的结尾,即紧随一个换行符之前)
    \b 匹配单词的边界
    \B 匹配除单词边界以外的部分
    [] 匹配方括号中指定的任意一个原子
    [^] 匹配除方括号中的原子以外的任意一个字符
    ( ) 匹配其整体为一个原子,即模式单元。可以理解为由多个单个原子组成的大原子

        1. 字符串边界限制
            元字符“^”或“\A” 置于字符串的开始确保模式匹配出现在字符串首端;
            元字符“$”或“\Z” 置于字符串的结束,确保模式匹配出现字符串尾端。
        2. 单词边界限制
            元字符“\b”对单词的边界进行匹配;
            元字符“\B”对除单词边界以外的部分进行匹配。
        3. 重复匹配
            元字符“?”:表示0次或1次匹配紧接在其前的原子。
            元字符“*”:表示0次、1次或多次匹配紧接在其前的原子。
            元字符“+”:表示1次或多次匹配紧接在其前的原子。
        4. 任何一个字符
            元字符“.”匹配除换行符外任何一个字符。
            通常可以使用“.*”组合来匹配除换行符外的任何字符。在一些书籍中也称其为“全匹配符” 或 “单含匹配符”。
        5. 重复匹配
            元字符“{ }”准确地指定原子重复的次数,指定所匹配的原子出现的次数。
          “{m}”   表示其前原子恰好出现m次。
          “{m,n}”表示其前原子至少出现m次,至多出现n次。
          “{m,}” 表示其前原子出现不少于m次。
        6. 原子表 -方括号表达式
            原子表”[]”中存放一组原子,彼此地位平等,且仅匹配其中的一个原子。
            原子表 ”[^]” 或者称为排除原子表,匹配除表内原子外的任意一个字符。
            原子表“[-]”用于连接一组按ASCII码顺序排列的原子,简化书写。  
        7. 模式选择符
            元字符“|”又称模式选择符。在正则表达式中匹配两个或更多的选择之一。
        8. 模式单元
            元字符“()”将其中的正则表达式变为原子(或称模式单元)使用。与数学表达式中的括号类似,“()”可以做一个单元被单独使用。
        9. 重新使用的模式单元 
            系统自动将模式单元“()”中的匹配依次存储起来,在需要时可以用“\1”、“\2”、“\3”的形式进行引用。
            当正则表达式包含有相同的模式单元时,这种方法非常便于对其进行管理。注意使用时需要写成“\\1”、“\\2”
            当不需要存储匹配结果时使用非存储模式单元“(?:)” 
            例如/(?:a|b|c)(D|E|F)\\1g/ 将匹配“aEEg”。在一些正则表达式中,使用非存储模式单元是必要的。否则,需要改变其后引用的顺序。
        10. 模式匹配优先级
            顺序      元字符                         描述
            1           \                                   转义字符
            2           ()  (?:)  (?=)  []              模式单元和原子表
            3           *  +   ?  {n}  {n,} {n,m}   重复匹配
            4           ^  $  \b  \B  \A   \Z      边界限制
            5           |                                   模式选择
    

    2.4 模式修正符
    修正符 含义描述
    i 在和模式进行匹配时不区分大小写
    m 将字符串视为多行。默认的正则开始“^”和结束“$”将目标字符串作为单一的一“行”字符。加上m后,那么开始和结束将会指字符串的每一行。
    s 如果设定了此修正符,模式中的圆点元字符“.”匹配所有的字符,包括换行符。即将字符串视为单行,换行符作为普通字符看待
    x 模式中的空白忽略不计,除非它已经被转义
    e 只用在preg_replace()函数中,在替换字符串中对逆向引用做正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。
    U 本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (U) 修正符或者在数量符之后跟一个问号(如启.*?)来用此选项。

  3. 与Perl兼容的正则表达式函数
    3.1 子符串的匹配与查找函数
    preg_math()
    preg_match_all()
    preg_grep()

    3.2 字符串的替换函数
    preg_replace()
    preg_replace_callback()
    preg_fliter()

    3.3 字符串的分割与连接
    preg_split()

    3.4 其他
    preg_quote()
    preg_last_error()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值