10.正则表达式

由于在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;
?>



b、大小写的区别,

“大写”是“小写”的“非”

[\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 )



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值