九零登录

[【通过】] PHP正则表达式

[复制链接]
发表于 2017-4-19 00:21:19 | 显示全部楼层 |阅读模式
本帖最后由 水清云影 于 2017-4-19 00:32 编辑

任何事情没有成功之前都是枯燥乏味的。编程也是一样,自学期间遇到了很多问题,如果有错误希望大家可以指出来。
也希望可以在坛子里分享自己的学到的知识,也会跟紧大牛们的步伐~

祝90越办越好~

一、正则表达式介绍
正则表达式是用于描述字符排列和匹配模式的一种规则,主要用于字符串的匹配、查找、替换、分割等操作
-------------------------------------------------------------------------------------------------------------------------------------------------
二、语法规则
表达式的格式: "/表达式/[修正符]"三、原子
1、普通字符作为原子
$pattern = '/a/';                      //匹配字符中含有a的
$pattern = '/abc/';                 //匹配字符中含有abc的
2、一些带有特殊符号的字符作为原子
$pattern = '/\<br\>/';           //匹配含有带<br>的字符,特殊符号前要加\
3、"通用字符类型"作为原子
$pattern = '/\d/';                   //匹配任何一个数字
$pattern = '/\D/';                  //匹配任何一个非数字
$pattern = '/\w/';                 //匹配任何一个 数字、字母(大小写)、下划线
$pattern = '/\W/';                //匹配任何一个 非 数字、字母(大小写)、下划线
$pattern = '/\s/';                 //匹配任何一个空白字符 空格 \n \r 回车 换行
$pattern = '/\S/';                //匹配任何一个非空白字符
4、自定义原子表([])作为原子
$pattern = '/[apj]sp/'       //匹配[apj]中任意一个字符作为原子,asp php jsp
$pattern = '/[^apj]sp/'    //匹配除了[apj]三种以外的其它字符作为原子,如xsp yhp zsp
注:原子表"[^]"可以匹配除表内的任意字符,若不在原子表内,则为边界字符
四、元字符
1、限定符(* + ? {})
$pattern = '/go*gle/';           //  *    匹配前面出现的原子 0次、1次或多次,如geegle、google、gooogle
$pattern = '/go+gle/';          //  +    匹配前面出现的原子 1次或多次,如google、goooooogle
$pattern = '/go?gle/';          //  ?    匹配前面出现的原子 0次或1次,如ggle、gogle
$pattern = '/go{2}gle/';      // {n}   修饰前面的原子出现n次,如google
$pattern = '/go{2,}gle/';     // {n,}  修饰前面的原子至少出现n次,如google,goooogle
$pattern = '/go{2,4}gle/';   // {n,m} 修饰前面的原子出现至少出现n次最多出现m次,如google,gooogle
2、边界限制(^ $)
$pattern = '/^abc/';               //  ^ 匹配输入字符的开始位置,如必须以abc开头,如abc123
$pattern = '/abc$/';               //  $ 匹配输入字符的结束位置,如必须以abc结尾,如123abc
$pattern = '/^abc$/';            //  只能匹配abc
3、句号(.)
$pattern = '/a.b/';                // . 匹配除换行符之外的任意一个字符,如axb,ayb,azb         (1)贪婪模式(.*?)
字符串        aa<div>test1</div>bb<div>test2</div>cc
正则表达式     <div>.*</div>
--------------------------------------------------------------
匹配内容       <div>test1</div>bb<div>test2</div>              正则表达式在匹配到第一个"</div>"时已经可以是表达式匹配成功,但是采用的是贪婪模式,会继续向右匹配,直到匹配失败为止
        (2)非贪婪模式(.*?)
字符串        aa<div>test1</div>bb<div>test2</div>cc
正则表达式     <div>.*</div>
--------------------------------------------------------------
匹配内容       <div>test1</div>             正则表达式在匹配到第一个"</div>"时使整个表达式匹配成功,由于采用的是非贪婪模式,就结束匹配
4、模式选择符 (|)
$pattern = '/PHP|PYTHON/'                      // | 匹配两个或更多选择,表示可以选择PHP,也可以选择PYTHON5、模式单元()
$pattern = '/(ab)*c/'                               // ()把括号内的整体作为一个原子,表示abc、ababababc6、后向引用
$parttern = '/\d{4}(-|\/)\d{2}\\1\d{2}/'   //  \\1 代表第一个括号的缓冲区,也可以有多个,缓冲区编号从1开始五、模式修正符

  
模式修正符
  
说明
  
i
  
表示在和模式进行匹配进不区分大小写
  
m
  
如果没有使用这个模式修正符号,元字符中的"."默认不能表示换行符号,将字符串视为单行
  
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 不匹配的元素组成的数组.<?php
$list=array('[email protected]','[email protected]','wangwu','[email protected]');
//匹配邮箱
$newlist = preg_grep('/\w+@\w+(\.\w+){1,2}/',$list);
var_dump($newlist);
?>
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指定。<?php
//输入要匹配的字符串
$str = <<<EOF
<dd>
    <div><a target="_blank" href="http://mobile.jd.com/index.do">京东通信</a></div>
    <div><a target="_blank" href="http://my.jd.com/personal/guess.html">为我推荐</a></div>
    <div><a target="_blank" href="http://shipingou.jd.com/">视频购物</a></div>
    <div><a target="_blank" href="http://club.jd.com/">京东社区</a></div>
    <div><a target="_blank" href="http://read.jd.com/">在线读书</a></div>
    <div><a target="_blank" href="http://diy.jd.com/">装机大师</a></div>
    <div><a target="_blank" href="http://giftcard.jd.com/market/index.action">京东E卡</a></div>
    <div><a target="_blank" href="http://channel.jd.com/jiazhuang.html">家装城</a></div>
    <div><a target="_blank" href="http://dapeigou.jd.com/">搭配购</a></div>
    <div><a target="_blank" href="http://xihuan.jd.com/">我喜欢</a></div>
    </dd>
EOF;
//匹配所有的a链接 <a href="...">...</a>
$pattern = '/<a .*? href="(.*?)">(.*?)<\/a>/';
preg_match_all($pattern,$str,$match);
var_dump($match);
?>
3、preg_replace()

[url=]mixed[/url] preg_replace ( [url=]mixed[/url] $pattern , [url=]mixed[/url] $replacement , [url=]mixed[/url] $subject [, int $limit  = -1 [, int &$count ]] )
preg_replace($pattern,替换成什么,原字符);

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

正则表达式.png


评分

参与人数 1酒票 +5 收起 理由
管理05 + 5 欢迎加入90!

查看全部评分

发表于 2017-4-19 22:05:27 | 显示全部楼层
请问一下楼主的的思维导图用什么软件做的?
 楼主| 发表于 2017-4-20 11:53:27 | 显示全部楼层

RE: PHP正则表达式

用XMIND做的

发表于 2017-4-20 12:23:48 | 显示全部楼层
感谢 这个有用 收藏了
发表于 2017-4-20 15:56:03 | 显示全部楼层
稳.最近把手里的东西搞完开始好好学习php了。谢老哥分享

九零

GMT+8, 2026-10-22 14:31

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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