当前位置: 首页 > 后端技术 > PHP

正则表达式

时间:2023-03-29 22:33:54 PHP

第一章认识正则所谓正则,其实就是字符串正则表达式。例如,熟悉的“*”代表所有字符。其实不应该叫正则表达式,你叫它正则表达式公式更好,因为它的主要作用是通过规则找出你想找的东西。1.描述你要找的字符串的模式。2.调用函数执行正则表达式。1.php//找出字符串的'hi'//Rule:'hi'$str='hi,thisishishistory';$patt='/嗨/';preg_match_all($patt,$str,$res);print_r($res);程序员都会用到,但是不经常用,所以很容易忘记。开始于:你在找谁?如何找到它?找几个?具体字符(字面值)-->比如寻找a、b、hi字符边界(下粗体)-->字符集[ace]、[0123456789]从哪里开始到哪里结束-->任意条件在里面满足找出字符补集1:不在qxz的范围内-->不要用里面满足任何条件的字符范围[a-z0-9]-->注意:必须是连续的,你不能写a-Z字符簇(系统定义的常用集合,在第2章)-->系统定义的常用集合字符边界^匹配字符串的开头$匹配字符串的结尾\b匹配开头和结尾一个词的边界(boundary)\B匹配一个词的非边界Chapter2常用字符簇簇代表。(dot)任意字符,不包括换行符w[a-zA-Z0-9_]WW补s空白字符,包括nrtv等S非空白字符d[0-9]DNon-NumberChapter3WordMatching//找出字符串的hi字//规则,字的开头=>hi=>字的结尾\b$str='hi,thisissomehistorybook';$patt='/\bhi\b/';preg_match_all($patt,$str,$res);print_r($res);//查找单词中包含的hi$patt='/\Bhi\B/';$str=''Chapter4CollectionandComplementaryExample/*给定一组手机号码,它必须由[0123456789]组成,在哪里找?找到字符串的开头,找到字符串的结尾^$你在找谁[01235689]你在找多少?11*/$arr=array('13800138000','13487656887','434456','45454353434543');//$patt='/^[^47]{11}$/';//补全方法$patt='/^[01235689]{11}$/';//集合方法foreach($arras$v){preg_match_all($patt,$v,$res);print_r($res);}Chapter5characterrange//尝试找出由纯字母组成的单词$str='o2o,b2b,hello,wordl,that';//$patt='/\[a-zA-Z]{1,}\b';//{1,}至少1个字母$patt='/\b[a-zA-Z]+\b';preg_match_all($patt,$str,$res);print_r($res);第六章字符簇是系统指定的识别方式$str='tommorwisanotherday,o2o,youdon'tbirdmeidon'tbirdyou';$patt='/\W{1,}';//补码\w\w[a-zA-Z0-9_]//preg_split通过正则表达式拆分字符Stringprint_r(preg_split($patt,$str));//用一个空格替换多个空格或制表符$str='abhelloworld';//'abhelloworld';$patt='/\s{1,}/';//\s空格,包括\n\r\t\v等//preg_replace-执行正则表达式搜索并替换echopreg_replace($patt,'',$str);Chapter7找几个*匹配前面的子表达式零次或多次+与前一个子表达式匹配一次或多次。?零次或一次匹配前面的子表达式。{n}n是一个非负整数。恰好匹配n次。{n,m}m和n都是非负整数,其中n<=m至少匹配n次,最多匹配m次。.{n,}n为非负整数。至少匹配n次。$str='longrenlaowangmenggebi';//由5个字母组成的单词//$patt='/\b[a-zA-Z]{5}\b/';//3-5个单词Words由字母组成//$patt='/\b[a-zA-Z]{3,5}\b/';//由5个以上字母组成的单词//$patt='/\b[a-zA-Z]{5,}\b/';preg_match_all($patt,$str,$res);print_r($res);/*某编辑部键盘坏了,0键打不出来,经常打多个0makegodingood,gooood,请把这几个字换成god*/$s='goooood,goood,goooooooooood';$p='/go+d/';print_r(preg_replace($p,'god',$s));第8章或用法//查询纯数字或纯字字母$str='你好o2o2b9250';$patt='/\b[a-zA-Z]+\b|\b[0-9]+\b/';//至少一个preg_match_all($patt,$str,$res);print_r($res);//查询苹果系统产品$str='ipad,iphone,imac,ipod,iamsorry';$patt='/\bi(pad|phone|mac|pod)\b/';preg_match_all($patt,$str,$res);print_r($res);第9章贪心与非贪心$str='ksdagoodgooooodgoodklsjadfsdk';//将g(任意数量的内容)d之类的字符串替换为god$patt='/g.+d/';//默认贪心模式(会尽可能匹配)preg_match_all($patt,$str,$res);print_r($res);//上帝不好$patt='/g.+?d/';//在数量(+*{n,})限定符之后,加上?,非贪心模式preg_match_all($patt,$str,$res);print_r($res);//天哪,好啊第10章收集手机号$str='唐小姐,联系电话:18611015252,备用电话:18828821111,QQ:381413622,邮箱:381413622@qq.com,身份证号:430426199901013478';\//收集电话号码\$patt='/\b1[358]\d{9}\b/';\preg_match_all($patt,$str,$res);\print_r($res);第11章后向引用查找结尾字母相同的单词$str='txthello,high,bom,mum';//化简,先找$patt='/\bt\w+t\b/'其首和最后一个字母是t;preg_match_all($patt,$str,$res);print_r($res);这个方法重复26次,也可以找到第n个括号中的子表达式,命中的内容,然后用\n引用//backwardreference$patt='/\b([a-z])\w+\1\b/';//1。单词的开头和结尾\b\b//2。开头的[a-z]可以是.\b[a-z]\b//3。什么都可以跟着,没关系。并且字数不同限于\b[a-z]\w+\b//4。最后一个应该和第一个一样。\b([a-z])\w+\b子表达式,放在下面另一个数组中,最后引用子表达式表达式匹配的结果\b([a-z])\w+\1\bpreg_match_all($patt,$str,$res);print_r($res);replacethemiddle4digitsofthephonenumberwith*$str='13800138000,13426060134';//前3位和后4位放在子表达式中,中间4位随机,子表达式保留。替换中间4位$patt='/(\d{3})\d{4}(\d{4})/';//preg_match_all($patt,$str,$res);//print_r($资源);echopreg_replace($patt,'\1****\2',$str);第十二章模式修饰符可以在一定程度上影响正则表达式的解析行为。例如i表示正则表达式不区分大小写,/[a-zA-Z]+/--->/[a-z]+/i例如s,单行模式表示将整个文件当作一个"单行”,忽略回车$str='helloWORLDChINa';//$patt='/\b[a-z]+\b/';//你好$patt='/\b[a-z]+\b/i';//忽略大小写preg_match_all($patt,$str,$matches);print_r($matches);$str="abchaha??abcdgh";$patt='/.+/s';#single单行模式,将所有内容视为整行preg_match_all($patt,$str,$matches);print_r($matches);//U模式,传入参数视为unicode字符集的编码,可以判断中文//http://blog.sina.com.cn/s/blog_640937d101017pca.html//PHP下中文正则匹配,u模式,\x{4e00}-\x{9fa5}$str='bobLee';$patt='/^[\x{4e00}-\x{9fa5}]+$/u';echopreg_match($patt,$str)?'国货':'杂货';qxz?