老雷php全栈开发课程之php正则表达式
老雷PHP全栈开发教程之正则表达式
正则表达式是一个从左到右匹配目标字符串的模式,具有强大的查询匹配功能。
手册位置:函数参考 > 文本处理 > PCRE
一、常用函数
preg_match
preg_match_all
preg_replace
preg_replace_callback
二、 PCRE模式
1.分隔符 分隔符可以使任意非字母数字、非反斜线、非空白字符。 推荐: //
2.元字符
共有两种不同的元字符:一种是可以在模式中方括号外任何地方使用的,另外一种 是需要在方括号内使用的。
\ ^ $ .[] |()?*+{}
[\^-]
3.转义字符
\n 换行
\r 回车
\t 水平制表符
\d 任意十进制数字
\D 任意非十进制数字
\s 任意空白字符
\S 任意非空白字符
\w 任意单词字符
\W 任意非单词字符
锚 ^开始 $结束
4.模式修饰符
i 不区分大小写
S 当一个模式需要多次使用的时候,为了得到匹配速度的提升,值得花费一些时间 对其进行一些额外的分析。如果设置了这个修饰符,这个额外的分析就会执行。
U 非贪婪模式
u 模式和目标字符串都被认为是 utf-8 的
课后练习
去做一个采集网页并且获取
列表页的 链接 标题
详细页的 内容
<?php $str="asdasd_"; if(preg_match("/[^\w]+/",$str,$num)){ echo "存在<br/>"; }else{ echo "不存在<br/>"; } $str="中国是世界古老的国度,存在5000年历史文明。中国目前与14亿人口,也是最大的人口国度"; //匹配数字 preg_match("/[\d]+/",$str,$num); print_r($num); //子模式匹配 preg_match("/([\d]+)/",$str,$num); print_r($num); //匹配所有 preg_match_all("/[\d]+/",$str,$num); print_r($num); //preg_replace — 执行一个正则表达式的搜索和替换 echo $str=preg_replace("/[\d]+/","$0 匹配",$str); echo "<br />"; //preg_replace_callback使用回调替换 echo preg_replace_callback("/[\d]+/",function($matches){ return $matches[0]*2; },$str); //匹配邮箱 $str="362606856@qq.com"; if(preg_match("/\w+@\w+\.(\w)+/",$str)){ echo $str."是邮箱"; } //匹配中文 $str="as中ddd"; if(preg_match("/[\x{4e00}-\x{9fa5}]+/u",$str)){ echo $str."含中文<br/>"; } //过滤非法字符串 $preg="美女|写真|女优|混蛋"; $str="这家伙真实混蛋"; if(preg_match("/$preg/",$str)){ echo $str."含非法字符<br/>"; } //解析html 匹配出链接和标题 $html='<div class="list"> <div class="item"> <a class="link" href="http://www.deituicms.com">这是标题</a> <div class="price">¥123</div> </div> <div class="item"> <a class="link2" href="http://www.deituicms.com">这是标题</a> </div> <div class="item"> <a class="link3" href="http://www.deituicms.com">这是标题</a> </div> </div>'; preg_match_all("/<a[^>]*href="(.*)"[^>]*>(.*)<\/a>/iUs",$html,$arr); print_r($arr); //日期匹配 // 将文本中的年份增加一年. $text = "April fools day is 04/01/2002\n"; $text.= "Last christmas was 12/24/2001\n"; // 回调函数 function next_year($matches) { // 通常: $matches[0]是完成的匹配 // $matches[1]是第一个捕获子组的匹配 // 以此类推 return $matches[1].($matches[2]+1); } echo preg_replace_callback( "|(\d{2}/\d{2}/)(\d{4})|", "next_year", $text);