一,正则表达式的概述
正则表达式, ( Regular Expression,在代码中常简写为regex、regexp或RE )
用于描述字符排列和匹配模式的一种语法规则
然后, 对匹配到的正好符合规则的内容进行分割、匹配、检索及替换操作
二,正则表达式的格式
<?php
$ptn = '/ 表达式/[修正符] ';
$ptn = '# 表达式#[修正符] ';
/*
分隔符 或 定界符通常用 '/ /'和 '# #' 代表正则的开始与结束
注意:定界符不可以是字母、数字和反斜线\, 可以是其他符号像 #、|、!等都可以
其中修正符是可选的,表示对表达式做额外的修饰
*/
?>
三,正则表达式的组成
- 原子 可以是字母数字下划线以及其它可见字符 还有一些标点 ; . / ? 表示要匹配的内容
- 元字符 一些字符被赋予特殊的涵义,使其不再单纯的代表自己,模式中的这种有特殊涵义的编码字符称为元字符
- 模式修饰符 对正则表达式的补充说明 比如是否区分大小写等
四,普通字符
/a/ 表示在字符串中查找 字符串 a
元字符
/[ ]/ 匹配中括号内的任意一个字符
/[ab]/ 表示在字符串中查找 a 或者 b 中的
/[0-9]/ 表示在字符串中查找 任意一个数字
/[a-z]/ 表示匹配 任意一个 小写字母
/[a-zA-Z]/ 表示匹配 任意一个 字母
/[^]/ 取反 匹配中括号内之外的任意一个字符
/[^0-9]/ 表示匹配 任意一个 非数字
/|/ 两边之间的一个选择
/red|green|blue/ 匹配red 或者 green 或者 blue字符串
/\d/ 表示匹配任意一个 十进制数字 即[0-9]
/\D/ 表示匹配任意一个 非十进制数字 [ ^0-9 ] 相当于[ ^\d ]
/\w/ 表示匹配任意一个 数字、字母或下划线 即[ 0-9a-zA-Z_ ]
/\W/ 表示匹配任意一个 非数字、字母或下划线 [ ^0-9a-zA-Z_ ] ,相当于[ ^\w ]
/\s/ 表示匹配一个不可见的原子,即[ \f\n\r\t\v ]
/\S/ 表示匹配一个可见的原子
/./ 表示匹配除了换行符( \n )以外的, 任意一个字符
/*/ 表示匹配任意次
/?/ 表示匹配0次或1次
/+/ 表示匹配1次或多次
六,匹配次数的限定符
/a{4}/ 表示匹配连续出现的4个a字符串
/a{1,4}/ 表示匹配连续出现的a字符串, 最少1次, 最多4次 默认情况下为贪婪模式, 即取大优先
/a{1,}/ 表示匹配a字符, 可以是1次或多次 可以用 + 表示
/a{0,1}/ 表示匹配a字符, 可以是0次或1次 可以用 ? 表示
/a{0,}/ 表示匹配a字符, 可以是0次,1次或多次 可以用 *
( ) 表示一个整体, 匹配括号里面的内容并获取这一匹配
/(abc){4}/ 用括号括起来, 表示abc这个字符串, 连续出现4次
/(f|g)ood/ 匹配food 或者 good
七,边界控制
^ 匹配字符串开始的位置
$ 匹配字符串结尾的位置
/^abc/ 表示匹配abc这个字符串, 并且要求abc要出现在开头
/abc$/ 表示匹配abc这个字符串, 并且要求abc要出现在结尾
/^abc$/ 表示被匹配的字符串只能是abc, 不能多一个字母,也不能少一个字母
八,模式修饰符
/abc/i 表示字母会进行大小写不敏感匹配 所以 ABC也会匹配成功
/.*/s 让元字符'.' 匹配包括换行符在内的所有字符 这个表达式表示匹配任意字符的任意次数
九,正则表达式处理函数
preg_match_all( 正则表达式, 被匹配的字符串, 数组 ) 匹配全部,搜索结果match的数据结构为二维数组
preg_match(正则表达式, 被匹配的字符串, 数组) 匹配一次,搜索结构match的数据结果为一维数组
<?php
// 要匹配的字符串
$str = '-12a3b456c7890d58xy';
// 正则
$ptn = '/\w+/';
// 执行匹配处理函数
preg_match_all($ptn, $str, $arr);
// 查看匹配结果
echo '<pre>';
print_r( $arr );
?>
preg_split( 正则表达式, 要匹配的目标 ) 以正则表达式来分割字符串
<?php
// 目标字符串
$str = "23,45;67#89;08:76";
// 正则表达式
$ptn = '/[:,;#]/';
// 分割字符串, 分割结果为一个数组
$arr = preg_split($ptn, $str);
var_dump($arr);
?>
preg_replace( 正则表达式, 目标字串或数组 ) 执行一个正则表达式搜索和替换,返回值为替换后的字符串
<?php
//替换<b>标签为空
$str = '<b>abc</b><b>abc</b>';
$ptn = '/<b>(.*?)<\/b>/';
$res = preg_replace($ptn,'江疏影',$str);
var_dump($res);
?>
九,子模式
<?php
// 目标字符串
$str = "<img src='./a/b.jpg' />";
// 正则表达式
$ptn = '/<img src=.*?\/>/'; // 匹配整个标签
$ptn = '/<img src=(.*?)\/>/'; // 匹配整个标签, 小括号中的内容会生成一个子数组, 称为子模式
// 执行匹配函数
preg_match_all($ptn, $str, $arr);
?>
? 号在正则表达式中还有一个意思. 就是 拒绝贪婪. 要求尽量少的匹配
贪婪模式: 尽量是往多的取
懒惰模式: 往少了匹配
<?php
.* 会匹配后面的一切字符,就是到结束的意思 加?后就是不贪婪模式,这时要看?后边的字符是什么了,
.*?" 的意思是遇到双引号则匹配结束
.*?> 的意思是遇到>则匹配结束
$str = '<b>a?aa</b> <b>ccb>c</b> <b>ddd</b><b></b>';
$ptn = '/<b>.*<\/b>/'; //贪婪模式
$ptn = '/<b>.*?<\/b>/'; //懒惰模式
$str = 'axaaxaaaxaaaax';
$ptn = '/a{1,4}?/'; //懒惰模式 表示尽量匹配1次
?>
|