正则表达式

本文深入探讨了正则表达式的基本语法、匹配模式、特殊字符及其应用,包括在文本搜索、验证和替换中的常见使用场景。通过实例解析,帮助读者掌握这一强大的文本处理工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php
/*
1.行定位符 描述子串的边界 ^表示开头 &表示结尾
^tm  匹配tm的位置是行头 如 tm Tomorrow Moon可以匹配
tm&  匹配tm的位置是行尾 如 Tomorrow Moon tm可以匹配
如果要匹配的子串可以出现在任何一个位置 则写成 tm 如html utmost 

2.单词定界符 \b \B
\b \btm\b 表示要匹配单词tm 而不是单词的一部分
\B 与 \b相反 匹配的子串不是一个完整的单词 必须是其他单词或子串的一部分

3.字符类 []
忽略大小写 只要匹配的字符出现在方括号内即匹配成功 一个方括号只能匹配一个字符
[Tt][Mm]

4.选择字符 |
实现字符类的匹配方式
如上述可以写成
T|tM|m
以字母T或t开头 后接一个M或m

5.连字符 -
若要匹配符合命名规则的变量 [a,b,c,...,A,B...] 可写成[a-zA-Z]

6.排除字符 [^]
若要匹配不符合命名规则的变量 [^a-zA-Z]

7.限定符 ? * + {n,m}
? 匹配前面的字符0次或1次 colou?r 可以匹配colour和color 对colo进行全局搜索 后匹配0个或一个u
+ 匹配前面的字符1次或多次 go+gle 可以匹配的范围从gogle到goo...gle
* 匹配前面的字符0次或多次 go*gle 可以匹配的范围从ggle到goo...gle
{n} 匹配前面的字符n次 go{2}gle 只能匹配google
{n,}  匹配前面的字符最少n次 go{n,}gle 可以匹配的范围从google到goo...gle
{n,m} 匹配前面的字符最少n次 最多m次 employe{0,2} 可以匹配 employ employe emplooyee 3种情况

8.点号字符 . 可以匹配除换行符之外的 任意一个字符
如匹配以s开头 t结尾 中间包含一个字母的单词 ^s.t$
第一个字母为r 第三个字母为s 最后一个字母为t ^r.s.*t$

9.转义字符 \
用正则表达式匹配诸如127.0.0.1这样格式的IP地址 直接使用点字符 格式为
[0-9]{1,3}(.[0-9]{1,3}){3}
这样显然不对 因为.可以匹配任意一个字符  这时会匹配127101011这样的字符 所以在匹配.时 要使用转义字符\
修改后的正则表达式为[0-9]{1,3}(\.[0-9]{1,3}{3})

10.反斜线 \
(1)显示不可打印的字符
\a   \b   \e  \f   \n  \r   \t        \xhh       \ddd       \cx
警报 退格 Esc 换页 换行 回车 水平制表符 十六进制代码 八进制代码 Ctrl+x x是任意字符
(2)指定预定义字符集
\d 			\D 			\s 							\S 
十进制[0-9] 非十进制数字 任何一个空白字符[\f\n\r\t] 任何一个非空白字符 
\w 						\W
任何一个单词字符[a-zA-Z] 任何一个非单词字符
(3)定义断言
\b 			\B 			\A 
单词定界符 非单词定界符 匹配待搜索文本的某些位置  
\Z 
在未指定任何模式下匹配的字符 通常是字符串的末尾位置 或是末尾的换行符前的位置 
\z 						\G
只匹配末尾 不考虑换行符 当前匹配的起始位置

11.括号字符 () 
改变限定符的作用范围
(third|four)th
这个表达式的意思是匹配thirdth或fourth 如果没有小括号 就变成匹配third 和fourth了

12.反向引用
匹配连续出现的子串或字母
如连续匹配两个it (it)\1 将it作为分组 后加上\1

13.模式修饰符
i (?i)...(?_i),(?i:...) 忽略大小写
m (?m)...(?_m),(?m:...) 多文本格式 即字符串内部有多个换行符时
s (?s)...(?_s),(?s:...) 单文本匹配模式 在此模式下 .可以匹配\ 
x (?x)...(?_x),(?x:...) 忽略空白字符
*/

//PCRE兼容正则表达式
//1.preg_grep()
//array preg_grep(string pattern,array input)
//使数组input中的元素一一匹配表达式pattern 最后返回所有相匹配元素组成的数组
$preg='/\d{3,4}-?\d{7,8}/';	//国内号码格式表达式
$array=array('0432112345678','0413-12345678','12345678');
$preg_arr=preg_grep($preg, $array);
var_dump($preg_arr);
echo '<br/>';

//2.preg_match() preg_match_all()
//int preg_match/preg_match_all(string pattern,string subject[,array matches]) 
//在字符串subject中匹配pattern 函数返回匹配的次数 如果有数组matches 那么匹配的结果将存储到matches中
//preg_match的返回值是1或0 因为该函数在匹配成功之后就停止查找了 preg_match_all()会一直匹配到最后
$str="This is an example!";
$preg='/\b\w{2}\b/';	//两个字母的单词
$num1=preg_match($preg, $str,$str1);
echo $num1.'<br/>';
var_dump($str1);
echo '<br/>';
$num2=preg_match_all($preg, $str, $str2);
echo $num2.'<br/>';
var_dump($str2);
echo '<br/>';

//3.preg_quote()
//string preg_quote(string str[,string delimiter])
//将字符串str中所有特殊字符进行转义 如果有参数delimiter 那么该参数包含的字符串也将被转义 返回转义后的字串
$str='!、$、^、+、.、[、]、\\、/、b、<、>';
$str2='b';
$match_one=preg_quote($str,$str2);
echo $match_one;
echo '<br/>';

//4.preg_replace()
//mixed preg_replace(mixed pattern,mixed replacement,mixed subject[,int limit])
//在字符串str中匹配表达式pattern 并将匹配项换成replacement 替换limit次
$str="[b]粗体字[/b]";
$b_str=preg_replace('/\[b\](.*)\[\/b]/i', '<b>$1</b>', $str);
//$1是在正则表达式外调用分组  按照$1 $2的排列顺序 一次表示从左到右的分组 也就是括号顺序 %0表示整个正则表达式匹配的值
echo $b_str.'<br/>';

//5.preg_replace_callback() 
//mixwd preg_replace_callback(mixed pattern,callback callback, mixed subject[,int limit])
//与preg_replace()作用相同 不同的是 它使用一个回调函数代替replacement
//在回调函数中 字符串使用"" 可以保证特殊符号不被转义
//调用时函数得到的参数是从subject 中匹配到的结果。回调函数返回真正参与替换的字符串。
function c_back($str){
	$str="<font color=$str[1]>$str[2]</font>";
	return $str;
}
$string='[color=blue]字体颜色[/color]';
echo preg_replace_callback('/\[color=(.*)\](.*)\[\/color\]/U', "c_back", $string);


?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值