PHP正则表达式
处理字符串时,有很多较为复杂的字符串用普通的字符串处理函数无法干净的完成。比如说,可能需要验证一个Email地址是否合法,为此需要查看许多不容易检查的规则。这正是正则表达式的用武之地。正则表达式是功能强大而简明的字符组,其中可以包含大量的逻辑,特别值得一提的是正则表达式相当简短。
一.正则表达式语法(Perl风格)
Perl一直被认为是最伟大的解析语言之一,它提供了一种全面的正则表达式,即使是最复杂的字符串模式,也可以用这种正则表达式语言搜索和替换。PHP开发人员认识到,与其重新发明正则表达式,不如让PHP用户直接使用声名赫赫的Perl正则表达式语言,即Perl风格的函数。
模式规则:/php/ 在字符串前后加上两条斜杠即可。
匹配函数:preg_match()函数在字符串中搜索模式,如果存在则返回true,否则返回false。
//尝试写第一个正则表达式 //匹配,就是一个一个比较过去,按照模式来匹配,只要模式通过就通过 //匹配和相等不一样,匹配是包含就好 echo preg_match('/php/', 'php'); //1,匹配返回1 $mode = '/php/'; //模式 $string = 'phpfasdfasd'; //字符串 echo preg_match($mode, $string); //1
二.正则表达式中的元素
正则表达式中包含三种元素分别为:量词、元字符、修饰符
/*正则表达式的语法(Prel风格) */ /*量词 */ //尝试写第一个正则表达式 //匹配,就是一个一个比较过去,按照模式来匹配,只要模式通过就通过 //匹配和相等不一样,匹配是包含就好 echo preg_match('/php/', 'php'); //1,匹配返回1 $mode = '/php/'; //模式 $string = 'phpfasdfasd'; //字符串 echo preg_match($mode, $string); //1 /*正则表达式中的元素 */ //正则表达式中包含三种元素分别为:量词、元字符、修饰符 //+:匹配任何至少包含一个前导字符串 $mode = '/ph+p/'; //此处h就是前导字符串 $string = 'phhhhhhpfasdfasd'; //包含至少一个h就匹配 if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } //*:匹配任何包含零个或多个前导字符串 $mode = '/ph*p/'; //此处h就是前导字符串 $string = 'ppfasdfasd'; //包含0个或多个h就匹配 if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } //?:匹配任何包含零个或多个前导字符串 $mode = '/ph?p/'; //此处h就是前导字符串 $string = 'phhpfasdfasd'; //包含0个或1个h就匹配 if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; //不匹配,因为有两个 } //.:匹配任意一个字符 //经常和*一起用:.*:0个或多个任意字符 $mode = '/ph.p/'; $string = 'phjpfasdfasd'; //.和j匹配,多了不行 if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } //{x}:匹配任何包含x个前导字符串 $mode = '/ph{3}p/'; $string = 'phhhpfasdfasd'; //刚好有3个h才匹配 if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } //{x,y}:匹配任何包含x到y个前导字符串 //{x,}:匹配至少x个前导字符 $mode = '/ph{3,5}p/'; $string = 'phhhhpfasdfasd'; //有3-5个h才匹配 if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } //$:从行尾开始匹配 $mode = '/php$/'; $string = 'phhhhpfasdfasdphp'; if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } //^:从开头开始匹配 $mode = '/^php/'; $string = 'phphhhpfasdfasdphp'; if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } //|:条件选择符,只要有其中一个匹配就匹配 $mode = '/php|jsp|java/'; $string = 'jsp'; if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } //():分组或定义个反引用,可以使用\1\2提取 $mode = '/(This) (is) (a)(Teacher)/'; $string = 'This is a Teacher'; if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } /*元字符 */ //[],是一种正则语法,里面的东西表示任意一个即可 //[a-z]:匹配任何包含小写字母a-z的字符串 //[A-Z]:匹配任何包含大写字母A-Z的字符串 //[abc]:匹配任何包含小写字母a、b、c的字符串 //[^abc]:匹配任何不包含小写字母a、b、c的字符串 //[a-zA-Z0-9_]:匹配任何包含a-zA-Z0-9和下划线的字符串 $mode = '/[abc][^abc][a-z]/';//第一个字母必须是abc中的一个;第二个必须不是abc;第三个a-z中任意一个 $string = 'php'; if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } //\w:匹配任何包含a-zA-Z0-9和下划线的字符串,同[a-zA-Z0-9_] //\W:和上边相反,匹配任何没有下划线和字母数字的字符串 //\d:匹配任何数字字符,和[0-9]相同 //\D:匹配任何非数字字符,和[^0-9]相同 //\s:匹配任何空白字符 //\S:匹配任何非空白字符 //\b:匹配是否到达了单词边界,边界可以理解为空格 //\B:匹配是否没有达到单词边界 //\ :匹配正则中的特殊字符 $mode = '/\whp/';//也可以这样写[\w] $string = 'php'; if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } $mode = '/ph\+p/';//+是正则里的特殊字符,需要转移,否则就是前导的意思了 $string = 'ph+p'; if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } /*修饰符 */ //i:不区分大小写 $mode = '/php/i';//i表示不区分大小写 $string = 'PHPKK'; if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } //m:多行匹配 $mode = '/php$/m';// $string = "This is php\n,is good"; //要用双引号,才能解析换行 if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } //x:忽略正则中的空白 $mode = '/ph p/x'; $string = 'php'; if (preg_match($mode, $string)){ echo '匹配'; }else{ echo '不匹配'; } //A:强制从头开始匹配 //U:禁止贪婪模式,只跟踪到最近的一个匹配符并结束
三.Perl风格函数
PHP为使用Perl兼容的正则表达式搜索字符串提供了7个函数,包括:preg_grep()、preg_match()、preg_match_all()、preg_auote()、preg_replace()、preg_replace_callback()和preg_split()。
//搜索数组中的相匹配的字符串 //preg_grep(); $language = array('php','asp','jsp','python','ruby'); //找出3p语言 $mode = '/p$/'; print_r(preg_grep($mode, $language)); //搜索模式,字符串中搜索模式,如果存在则返回true,否则返回false。最后返回真或假 //preg_match(); echo preg_match('/php[1-6]/', php5); //1 //电子邮件案例 $mode = '/([a-zA-Z0-9_\.]{2,255})@([\w\-]{1,255}).([a-z]{2,4})/'; $string = 'yc60.com@gmail.com'; if(preg_match($mode, $string)){ echo '合法'; }else { echo '不合法'; } //匹配模式的所有出现:preg_match_all()函数在字符串中匹配模式的所有出现,然后将所有匹配到的全部放入数组。 //preg_match_all(); preg_match_all('/php[1-6]/','php5asdfadfphp6asdfasdfp',$out); print_r($out);//数组 //定界正则:preg_quote()在每个对于正则表达式语法而言有特殊含义的字符前插入一个反斜线。这些特殊字符包含:$ ^ * () + = {} [] | \\ : <>。 echo preg_quote('PHP的价格是:$150'); //在特殊字符前加\ //最常用的preg_replace();替换 //替换模式的所有出现:preg_replace()函数搜索到所有匹配,然后替换成想要的字符串返回出来。 echo preg_replace('/php[1-7]/','python','php5的后一版是php6');//将第三个参数中的php4和php5替换为Python //贪婪和分组获取的案例,ubb $mode = '/(\[b\])(.*)(\[\/b\])/U'; //用括号分为第三组,那么第一组就是\1,第二组就是\2,第三组就是\3;U禁止贪婪,不禁止贪婪,死一个[b]和最后一个[\b]匹配 $replace = '<strong>\2</strong>'; $string = 'This is a [b]php5[/b],this is [b]php6[/b]';//将[b]换成是<strong> echo preg_replace($mode,$replace,$string); //分割字符串:preg_split(); $arr = preg_split('/[@\.]/', '12.3@256'); //用.或@分割 print_r($arr);
本博客作为一个入门者的自学记录,欢迎各位同行者不吝赐教。