(六)PHP的正则表达式

[复制链接]
发表于 2025-11-8 15:14:38 | 显示全部楼层 |阅读模式
一,正则表达式的概述

正则表达式,  ( Regular Expression,在代码中常简写为regex、regexp或RE )

用于描述字符排列和匹配模式的一种语法规则

然后, 对匹配到的正好符合规则的内容进行分割、匹配、检索及替换操作
二,正则表达式的格式



<?php
        $ptn = '/ 表达式/[修正符] ';
        $ptn = '# 表达式#[修正符] ';
        
        /*
        分隔符 或 定界符通常用 '/  /'和 '# #'   代表正则的开始与结束
            注意:定界符不可以是字母、数字和反斜线\, 可以是其他符号像 #、|、!等都可以
            其中修正符是可选的,表示对表达式做额外的修饰
            */
?>            


三,正则表达式的组成


- 原子       可以是字母数字下划线以及其它可见字符   还有一些标点 ;  .  /  ?     表示要匹配的内容
- 元字符      一些字符被赋予特殊的涵义,使其不再单纯的代表自己,模式中的这种有特殊涵义的编码字符称为元字符
- 模式修饰符      对正则表达式的补充说明  比如是否区分大小写等


四,普通字符

/a/ 表示在字符串中查找 字符串  a

元字符

/[ ]/        匹配中括号内的任意一个字符

        /[ab]/ 表示在字符串中查找 a  或者   b  中的

        /[0-9]/ 表示在字符串中查找 任意一个数字

        /[a-z]/ 表示匹配  任意一个  小写字母

        /[a-zA-Z]/ 表示匹配  任意一个  字母

/[^]/        取反  匹配中括号内之外的任意一个字符

/[^0-9]/        表示匹配 任意一个 非数字

/|/        两边之间的一个选择
/red|green|blue/ 匹配red 或者 green 或者 blue字符串
/\d/         表示匹配任意一个 十进制数字   即[0-9]
/\D/         表示匹配任意一个 非十进制数字  [ ^0-9 ] 相当于[ ^\d ]
/\w/         表示匹配任意一个 数字、字母或下划线    即[ 0-9a-zA-Z_ ]
/\W/         表示匹配任意一个 非数字、字母或下划线  [ ^0-9a-zA-Z_ ] ,相当于[ ^\w ]
/\s/             表示匹配一个不可见的原子,即[ \f\n\r\t\v ]
/\S/              表示匹配一个可见的原子
/./         表示匹配除了换行符( \n )以外的, 任意一个字符
/*/        表示匹配任意次
/?/         表示匹配0次或1次
/+/        表示匹配1次或多次


六,匹配次数的限定符
/a{4}/ 表示匹配连续出现的4个a字符串
/a{1,4}/ 表示匹配连续出现的a字符串, 最少1次, 最多4次   默认情况下为贪婪模式, 即取大优先
/a{1,}/ 表示匹配a字符,  可以是1次或多次                    可以用  +  表示   
/a{0,1}/ 表示匹配a字符,  可以是0次或1次                     可以用  ?   表示
/a{0,}/ 表示匹配a字符,   可以是0次,1次或多次           可以用  *



( )     表示一个整体, 匹配括号里面的内容并获取这一匹配

        /(abc){4}/ 用括号括起来, 表示abc这个字符串, 连续出现4次

          /(f|g)ood/ 匹配food 或者 good


七,边界控制

^        匹配字符串开始的位置

$         匹配字符串结尾的位置

/^abc/   表示匹配abc这个字符串, 并且要求abc要出现在开头

/abc$/    表示匹配abc这个字符串, 并且要求abc要出现在结尾

/^abc$/ 表示被匹配的字符串只能是abc, 不能多一个字母,也不能少一个字母


八,模式修饰符

/abc/i        表示字母会进行大小写不敏感匹配   所以 ABC也会匹配成功

/.*/s        让元字符'.' 匹配包括换行符在内的所有字符         这个表达式表示匹配任意字符的任意次数


九,正则表达式处理函数

preg_match_all( 正则表达式, 被匹配的字符串, 数组 )  匹配全部,搜索结果match的数据结构为二维数组
preg_match(正则表达式,  被匹配的字符串, 数组)   匹配一次,搜索结构match的数据结果为一维数组

<?php
    // 要匹配的字符串
    $str = '-12a3b456c7890d58xy';
    // 正则
   $ptn = '/\w+/';      
    // 执行匹配处理函数
    preg_match_all($ptn, $str, $arr);

    // 查看匹配结果
    echo '<pre>';
    print_r( $arr );
?>


preg_split( 正则表达式, 要匹配的目标 )   以正则表达式来分割字符串

<?php
    // 目标字符串
    $str = "23,45;67#89;08:76";
         
    // 正则表达式
    $ptn = '/[:,;#]/';

    // 分割字符串, 分割结果为一个数组
    $arr = preg_split($ptn, $str);

    var_dump($arr);

?>

preg_replace( 正则表达式, 目标字串或数组 )    执行一个正则表达式搜索和替换,返回值为替换后的字符串

<?php
            //替换<b>标签为空
        $str = '<b>abc</b><b>abc</b>';
        $ptn = '/<b>(.*?)<\/b>/';
        $res = preg_replace($ptn,'江疏影',$str);
        var_dump($res);
?>


九,子模式

<?php
    // 目标字符串
    $str = "<img src='./a/b.jpg' />";
    // 正则表达式
    $ptn = '/<img src=.*?\/>/';    // 匹配整个标签
    $ptn = '/<img src=(.*?)\/>/';  // 匹配整个标签, 小括号中的内容会生成一个子数组, 称为子模式

    // 执行匹配函数
    preg_match_all($ptn, $str, $arr);
?>




?  号在正则表达式中还有一个意思. 就是 拒绝贪婪.   要求尽量少的匹配
贪婪模式: 尽量是往多的取
懒惰模式: 往少了匹配
<?php
        .*    会匹配后面的一切字符,就是到结束的意思  加?后就是不贪婪模式,这时要看?后边的字符是什么了,
             .*?"  的意思是遇到双引号则匹配结束
             .*?>  的意思是遇到>则匹配结束
        $str = '<b>a?aa</b> <b>ccb>c</b> <b>ddd</b><b></b>';
        $ptn = '/<b>.*<\/b>/';          //贪婪模式
        $ptn = '/<b>.*?<\/b>/';         //懒惰模式

        $str = 'axaaxaaaxaaaax';
        $ptn = '/a{1,4}?/';   //懒惰模式    表示尽量匹配1次
?>




必火网络安全培训,北京实地培训,月月有开班,零基础入门,四个月打造渗透高手。
详情请加微信:nvhack/153-2000-4362,手机微信同号。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|女黑客安全网 |网站地图 | 津ICP备17008032号-3

GMT+8, 2026-2-2 05:15 , Processed in 0.077756 second(s), 24 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表