zoukankan      html  css  js  c++  java
  • 【代码学习】PHP 正则表达式

    一、正则表达式介绍

    正则表达式是用于描述字符排列和匹配模式的一种规则,主要用于字符串的匹配、查找、替换、分割等操

    -------------------------------------------------------------------------------------------------------------------------------

    二、语法规则

    1 表达式的格式: "/表达式/[修正符]"

    原子

    1、普通字符作为原子

    1 $pattern = '/a/';      //匹配字符中含有a的
    2 $pattern = '/abc/';    //匹配字符中含有abc的

    2、一些带有特殊符号的字符作为原子

    $pattern = '/<br>/';   //匹配含有带<br>的字符,特殊符号前要加

    3、"通用字符类型"作为原子

    1 $pattern = '/d/';     //匹配任何一个数字
    2 $pattern = '/D/';     //匹配任何一个非数字
    3 $pattern = '/w/';     //匹配任何一个 数字、字母(大小写)、下划线
    4 $pattern = '/W/';     //匹配任何一个 非 数字、字母(大小写)、下划线
    5 $pattern = '/s/';     //匹配任何一个空白字符 空格 
     
     回车 换行 
    6 $pattern = '/S/';     //匹配任何一个非空白字符

    4、自定义原子表([])作为原子

    1 $pattern = '/[apj]sp/'  //匹配[apj]中任意一个字符作为原子,asp php jsp
    2 $pattern = '/[^apj]sp/' //匹配除了[apj]三种以外的其它字符作为原子,如xsp yhp zsp

    注:原子表"[^]"可以匹配除表内的任意字符,若不在原子表内,则为边界字符

    四、元字符

    1、限定符(* + ? {})

    1 $pattern = '/go*gle/';    //  *    匹配前面出现的原子 0次、1次或多次,如geegle、google、gooogle
    2 $pattern = '/go+gle/';    //  +    匹配前面出现的原子 1次或多次,如google、goooooogle
    3 $pattern = '/go?gle/';    //  ?    匹配前面出现的原子 0次或1次,如ggle、gogle
    4 $pattern = '/go{2}gle/';  // {n}   修饰前面的原子出现n次,如google
    5 $pattern = '/go{2,}gle/'; // {n,}  修饰前面的原子至少出现n次,如google,goooogle
    6 $pattern = '/go{2,4}gle/';// {n,m} 修饰前面的原子出现至少出现n次最多出现m次,如google,gooogle

    2、边界限制(^ $)

    1 $pattern = '/^abc/';      //  ^ 匹配输入字符的开始位置,如必须以abc开头,如abc123
    2 $pattern = '/abc$/';      //  $ 匹配输入字符的结束位置,如必须以abc结尾,如123abc
    3 $pattern = '/^abc$/';     //  只能匹配abc

    3、句号(.)

    1 $pattern = '/a.b/';       // . 匹配除换行符之外的任意一个字符,如axb,ayb,azb

    (1)贪婪模式(.*?)

    1 字符串        aa<div>test1</div>bb<div>test2</div>cc 
    2 正则表达式     <div>.*</div>
    -------------------------------------------------------------- 3 匹配内容 <div>test1</div>bb<div>test2</div>

      正则表达式在匹配到第一个"</div>"时已经可以是表达式匹配成功,但是采用的是贪婪模式,会继续向右匹配,直到匹配失败为止

    (2)非贪婪模式(.*?)

    1 1 字符串        aa<div>test1</div>bb<div>test2</div>cc 
    2 2 正则表达式     <div>.*</div>
    3 --------------------------------------------------------------
    4 3 匹配内容       <div>test1</div>

      正则表达式在匹配到第一个"</div>"时使整个表达式匹配成功,由于采用的是非贪婪模式,就结束匹配

    4、模式选择符 (|)

    1 $pattern = '/PHP|PYTHON/' // | 匹配两个或更多选择,表示可以选择PHP,也可以选择PYTHON

    5、模式单元()

    1 $pattern = '/(ab)*c/'    // ()把括号内的整体作为一个原子,表示abc、ababababc

    6、后向引用

    1 $parttern = '/d{4}(-|/)d{2}\1d{2}/'  //  \1 代表第一个括号的缓冲区,也可以有多个,缓冲区编号从1开始

    五、模式修正符

     模式修正符 说明
    i 表示在和模式进行匹配进不区分大小写
    m 将模式视为多行,使用^和$表示任何一行都可以以正则表达式开始或结束
    s 如果没有使用这个模式修正符号,元字符中的"."默认不能表示换行符号,将字符串视为单行
    x 表示模式中的空白忽略不计
    e 正则表达式必须使用在preg_replace替换字符串的函数中时才可以使用
    A 以模式字符串开头,相当于元字符^
    Z 以模式字符串结尾,相当于元字符$
    U 正则表达式的特点:就是比较“贪婪”,使用该模式修正符可以取消贪婪模式

    六、与Perl兼容的正则表达式函数

    1、preg_grep()

    array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )

    匹配数组中的元素,返回与正则表达式匹配的数组单元

    参数

    pattern  要搜索的模式, 字符串形式.
    input   输入数组.
    flag    如果设置为 PREG_GREP_INVERT , 这个函数返回输入数组中与 给定模式pattern 匹配的元素组成的数组.
    1 <?php
    2 $list=array('zhangsan@qq.com','li@souhu.com','wangwu','zhaoliu@aa.com.cn');
    3 //匹配邮箱
    4 $newlist = preg_grep('/w+@w+(.w+){1,2}/',$list);
    5 var_dump($newlist);
    6 ?>

    2、preg_match_all()

    int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
    匹配字符串到结尾,与preg_match()不同

    参数

    patter  要搜索的模式,字符串形式。
    subject   输入字符串。
    matches   多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定。
     1 <?php
     2 //输入要匹配的字符串
     3 $str = <<<EOF
     4  <dd>
     5     <div><a target="_blank" href="http://mobile.jd.com/index.do">京东通信</a></div>
     6     <div><a target="_blank" href="http://my.jd.com/personal/guess.html">为我推荐</a></div>
     7     <div><a target="_blank" href="http://shipingou.jd.com/">视频购物</a></div>
     8     <div><a target="_blank" href="http://club.jd.com/">京东社区</a></div>
     9     <div><a target="_blank" href="http://read.jd.com/">在线读书</a></div>
    10     <div><a target="_blank" href="http://diy.jd.com/">装机大师</a></div>
    11     <div><a target="_blank" href="http://giftcard.jd.com/market/index.action">京东E卡</a></div>
    12     <div><a target="_blank" href="http://channel.jd.com/jiazhuang.html">家装城</a></div>
    13     <div><a target="_blank" href="http://dapeigou.jd.com/">搭配购</a></div>
    14     <div><a target="_blank" href="http://xihuan.jd.com/">我喜欢</a></div>
    15     </dd>
    16 EOF;
    17 //匹配所有的a链接 <a href="...">...</a>
    18 $pattern = '/<a .*? href="(.*?)">(.*?)</a>/';
    19 preg_match_all($pattern,$str,$match);
    20 var_dump($match);
    21 ?>

    3、preg_replace()

    mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

    preg_replace($pattern,替换成什么,原字符);

    参数

    pattern    要搜索的模式。可以使一个字符串或字符串数组。
    replacement 用于替换的字符串或字符串数组。
    subject    要进行搜索和替换的字符串或字符串数组。如果subject是一个数组,搜索和替换回在subject 的每一个元素上进行, 并且返回值也会是一个数组。
    limit     每个模式在每个subject上进行替换的最大次数。默认是 -1(无限)。
    count     如果指定,将会被填充为完成的替换次数。
    1 <?php
    2 //日期时间的正则表达式
    3 $pattern = '/(d{2})/(d{2})/(d{4})/';
    4 //带有两个日期格式的字符串
    5 $text = "10/01/2017到10/07/2017";
    6 //将日期替换为以"-"分割的形式
    7 echo preg_replace($pattern,"${3}-${1}-${2}",$text);
    8 ?>

    七、思维导图

  • 相关阅读:
    最全的 Twitter Bootstrap 开发资源清单
    jQuery布局插件UI Layout简介及使用方法
    SQLcode错误代码汇总和sqlstate=37000的解决方案
    JQUERY插件学习之jQuery UI
    如何判断/检查一个集合(List<string>)中是否有重复的元素
    反射原理及简介
    C# 获取文件夹下的所有文件的文件名
    委托编程指南
    模块封装与程序集
    Redis Lock
  • 原文地址:https://www.cnblogs.com/sqyysec/p/6682489.html
Copyright © 2011-2022 走看看