由于在Javascript学习中,已经涉及了部分的“正则表达式”相关知识,在这里,就PHP而言,再来深究探讨一番,来看看这两者有什么不同吧!
内容要点:
1、正则表达式语法
2、正则表达式元素
3、perl风格函数
1、正则表达式语法
(1)模式规则:/php/ 在字符串前加上两条斜杠即可
(2)匹配函数:preg_match()函数在字符串中搜索模式,
返回的是boolean类型的,即若存在返回“true”,否则返回false。
该模式传递两个参数:第一个参数表示匹配模式(模式必须有两条斜杠,即和字符串比较,匹配),第二个参数是要匹配的字符串
(1)简单的方式
<?php
echo preg_match('/php/','php');
?>
结果:true(或1)
(2)分开表示
<meta http-equiv="Content-Type" content="text/html;charset="GBK"">
<?php
$mode='/php/'; //第一个参数,为模式
$string='php'; //第二个参数为字符串;
if(preg_match($mode,$string)){
echo '匹配';
}
else{
echo '不匹配';
}
?>
结果:匹配
注意:在上述案例中,“匹配”与“相等”并不是同一个概念,“相等”即是两个相等的字符串, 而“匹配”即是有类似的字符串即可。若“$mode='/php/';$string='sadsdphp'; echo preg_match($mode,$string);”即应该返回true。
由于第一个参数匹配的是一个“/php/”字符串php整体,string中有php,即返回true。
2、正则表达式元素
包含3个元素:量词、元字符、修饰符
(1)量词
“+”:匹配任何至少一个前导字符串(x>1)
“*”:匹配任何包含零个或多个前导字符串(x>=0)
“?”:匹配任何包含零个或一个前导字符串(x=0/1)
“.”:匹配任意字符串(x为R)
(注意:“.”一般与“*”一起使用,“.*”表示前导任意字符,并且0个或多个)
{x}:匹配任何包含x个前导字符串
{x,y}:匹配任何包含x到y个前导字符串
{x,}:表示匹配至少x个前导字符串
<?php
//h?表示0个或1个;
//.的意思表示任意的字符,所以对于两个..而言,应该对应两个php,p..p,phhp,此时返回true;
$mode='/ph?p/';
$string='php';
if(prep_match($mode,$string)){
echo '匹配';
}
else{
echo '不匹配';
}
?>
“$”:一般加在模式字符串尾巴上,表示从尾巴开始匹配
“^”:从开头开始匹配
(既有$,又有^时,表示两者相等,类似于“==”)
“|”:匹配字符串的左边或者右边
“O”:包围一个字符或多个字符的反引用(分组为一小段,作用于“提取”)。
<?php
//$表示从尾巴开始匹配,^表示从开头开始匹配
//当$与^一起使用的时候,即类似于相等,$mode与$string相等;
$mode='/php$/';
$string='phpasdffphp$';
if(prep_match($mode,$string)){
echo '匹配';
}
else{
echo '不匹配';
}
?>
(2)元字符
a、“[]”是一种语法,表示任意一个即可。
[a-z]:表示匹配a到z中的26个小写字母
[0-9]:表示匹配0到9中的10个数字
[A-Z]:表示匹配a到z中的26个大写字母
[a-zA-Z0-0]:表示匹配a-z,A-Z,0-9中的任意一个即可。
<?php
//[a-z]表示匹配任意一个就可
//由于匹配了第一个a,即就返回了true;
$mode='/[a-z]/'; ///规则模式
$string='abjkjbkj';
if(prep_match($mode,$string)){
echo '匹配';
}
else{
echo '不匹配';
}
?>
结果:true;
[^]:表示匹配除了方括号里的任意字符串
<?php
$mode='/[^abc]/';
$string='d';
echo preg_match($mode,$string); //true;
?>
“大写”是“小写”的“非”
[\w]:代表[a-zA-Z0-9]/_“a-z、A-Z、0-9、_”中的任意字符;
[\W]:与w正好相反
[\d]:代表[0-9]
[\D]:代表[^0-9]即不包括0-9之外的
[\s]:代表匹配空白字符
[\S]:代表匹配非空白字符
(3)修饰符
修饰符一般放在//的外边;
“i”:表示不区分大小写
“m”:表示匹配内容或者尾部内容时候采用多行识别匹配
(若遇到了换行\n时,即认为当前就是结尾)
“x”:忽略正则中的空白
“A”:强制从头开始匹配
“U”:禁止贪婪匹配,只跟踪最近的一个匹配法并结束
案例1:
<?php
//后缀加一个i表示不区分大小写
//
$mode='/php/i'; ///规则模式
$string='PHP';
if(prep_match($mode,$string)){
echo '匹配';
}
else{
echo '不匹配';
}
?>
结果:匹配
案例2:
$mode='/php$/m'; ///规则模式
$string='This is php\n,is good';
echo prep_match($mode,$string); //true;
3、perl风格函数
(1)搜索字符串:perg_grep()
搜索数组中相匹配的字符串,并返回相应的数组
<?php
$language=array('php','python','jsp','asp');
//找出最流行的3p语言,都以p结尾;
$mode1='/p$/'; //以p结尾;
$mode2='/^p/'; //以p开头;
print_r(preg_grep($mode1,$language));
print_r(preg_grep($mode2,$language));
?>
结果:第一个——Array[[0]—php [1]—jsp [2]—asp ]
第二个——Array[[0]—php [1]—python ]
应用小案例——电子邮件
(采用拆分的方法分组)
<?php
//$mode='(用户名)@(网址).(域名)';
$mode='([\w_\.])@([\w\-]{1,255}).()';
$string='yc60.com@gmail.com';
if(preg_match($mode,$string)){
echo '电子邮件合法';
}
else{
echo '不合法';
}
?>
(2)匹配全局正则:preg_match_all
preg_match_all('/php[1-6]/','$out');
print_r(out);
结果:Array[ [0]:php4 [1]:php5 [2]:php6 ]
(3)定界正则:preg_quote
(4)替换模式:preg_replace
<?php
//搜索匹配的结果,然后替换;
//第一个参数,存放正则的模式,第二个参数,存放替换掉的字符串,第三个参数,字符串;
echo preg_replce('/php[1-6]/','python','This is php5,this is php4');
?>
结果:This is python5,this is python4
应用小案例:贪婪和分组获取——ubb
<?php
$mode='/(\[b\])(.*)(\[\/b/])/'; //第一组\0,第二组\1
$replace='<strong></strong>';
$string='This is a [b]php5[\b],this is a [b]php4[/b]';
echo preg_replace($mode,$replace,$string);
?>
结果:This is a(由于$replace中并没有传递任何的数值,所以为空)
$replace='<strong>\2</strong>';
上述表示替换了\2的内容
<?php
//解决贪婪问题,/U
$mode='/(\[b\])(.*)(\[\/b/])/u'; //第一组\0,第二组\1
$replace='<strong>\2</strong>';
$string='This is a [b]php5[\b],this is a [b]php4[/b]';
echo preg_replace($mode,$replace,$string);
?>
结果:This is php5,this is php4
(5)分割:preg_split()把字符串划分为不同的元素
<?php
echo preg_split('/[\.@]/','yc60.com@gmail.com');
?>
结果:Array([0]:yc60.com [1]:gmail.com
)