正则表达式的组成部分
1.定界符 (必须)
通常使用特殊字符组成,常用“/”。
2.原子(必须)
是正则表达式的最基本组成单元,而且在每个模式中最少要包含一个原子。原子是由所有那些未显示指定为元字符的打印和非打印字符组成,具体分为5类。
- 普通字符作为原子:如a~z,A~Z,0~9。
- 一些特殊字符和转义后元字符作为原子:
\' \* \+ \? \.
等。 - 一些非打印字符作为原子:如:f n r t v cx。
- 使用“通用字符类型”作为原子:如:d D w W s S。
- 自定义原子表([ ])作为原子:如:'/[apj]sp/'。
3.元字符
4.模式修正符
示例:
# 匹配一个字符a
$pattern = '/a/';
# 匹配字符a,如果有返回1,没有返回0,只能匹配一次。
echo preg_match($pattern, '012344556');
# preg_match也可用于判断
if(preg_match($pattern, "1232423423", $matches)) {
echo "匹配到了<hr/>";
# 并把匹配出来的字符以数组的形式赋值给$matches;
# 打印结果:`array(1) {[0] => string(1) "a"}`;
var_dump($matches);
}else {
echo "没有匹配";
}
元字符匹配:
# 如果只想匹配 `.`,特殊含义的字符要转义。
$pattern = "/\./"
# 匹配非打印字符
$pattern = "/\n/"
# 匹配0-9数字
$pattern = "/\d/";
# 匹配除了0-9的数组
$pattern = "/\D/";
# 匹配数字+大小写字母+下划线
$pattern = "/\w/";
# 匹配除了数字、大小写字母、下划线
$pattern = "/\W/";
# 匹配空白符(换行、缩进、空格)
$pattern = "/\s/";
# 匹配除了空白符的字符
$pattern = "/\S/";
# `*` 代表匹配前面的原子出现0、1、或多次
$pattern = "so*u";
# `+` 代表匹配前面的原子出现1次、或多次
$pattern = "so+u";
# `?` 匹配前面的一个原子出现0次或者1次
$pattern = "hao?sou";
# 匹配除了换行符的任意字符
$pattern = "/./";
# `|`代表或者
$pattern = "/a|b|c/";
# 匹配前面的一个原子恰巧出现n次;
$pattern = "/hao{2}sou/";
# 匹配出现>=2次
$pattern = "/hao{2, }sou/";
# 匹配出现2-5次
$pattern = "/hao{2, 5}sou/";
# `^` 必须以该原子开头
$pattern = "/^aaa/";
# `$` 必须以该原子结尾
$pattern = "/aaa$/";
# 严格模式
# 必须严格只能匹配aaa。
$pattern = "/^aaa$/";
# a | b | c
$pattern = "/[abc]/";
# 除了a,b,c
$pattern = "/[^abc]/";
# `()`可以看做一个整体,还可以做反向引用
# 比如要匹配协议头为http、https、ftp
$pattern = "/(http|https|ftp):\/\//";
# 匹配除了空白符的任意字符
$pattern = "/.*/";
# `.*`贪婪模式
$str = "<b>abc</b><b>abc</b>";
$pattern = "/<b>.*</b>/";
# `.*?`取消贪婪模式
$pattern = "/<b>.*?</b>/";
或:
$pattern = "/<b>.*</b>/U";
介绍
1、正则表达式中包含三种元素分别为:量词、元字符、修饰符
2、前导字符串:就是符号前面的一个字符或字符串
量词
量词 说明
+ 匹配任何至少包含一个前导字符串
* 匹配任何包含零个或多个前导字符串
? 匹配任何包含零个或1个前导字符串
. 匹配任意一个字符串
{x} 匹配任何包含x个前导字符串
{x,y} 匹配任何包含 x 到 y 个前导字符串
{x,} 匹配任何包含至少x个前导字符串
^ 匹配字符串的行首
$ 匹配字符串的行尾
| 选择符 匹配字符串的左边或者右边
() 分组,提取
//量词
//preg_match()函数匹配成功返回1,失败返回0
echo preg_match('/a+/','abc');//返回1
echo preg_match('/a*/','abc');//返回1
echo preg_match('/a?/','abc');//返回1
echo preg_match('/./','abc');//返回1
echo preg_match('/a{2}/','aabc');//返回1
echo preg_match('/a{2,5}/','aaabc');//返回1
echo preg_match('/a{2,}/','aaaaabc');//返回1
echo preg_match('/^a/','bac');//返回0
echo preg_match('/^a/','abc');//返回1
echo preg_match('/a$/','abc');//返回0
echo preg_match('/a$/','cba');//返回1
echo preg_match('/a|b/','a');//返回1
echo preg_match('/a|b/','b');//返回1
echo preg_match('/(abc)+/','abcd');//返回1
元字符
元字符 说明
[a-z] 匹配任何包含小写字母a-z的字符串
[A-Z] 匹配任何包含大写字母A-Z的字符串
[0-9] 匹配任何包含0-9的字符串
[abc] 匹配任何包含小写字母a,b,c的字符串
[^abc] 匹配任何不包含小写字母a,b,c的字符串
[a-zA-Z0-9_] 匹配任何包含a-zA-Z0-9和下划线的字符串
\w 匹配任何包含a-zA-Z0-9和下划线的字符串
\W 匹配任何不包含a-zA-Z0-9和下划线的字符串
\d 匹配任何包含数字字符
\D 匹配任何非数字字符
\s 匹配任何空白字符
\S 匹配任何非空白字符
\b 匹配是否到达了单词边界
\B 匹配没有到达了单词边界
\ 匹配正则中的特殊字符
//元字符
echo preg_match('/[a-z]/','abc');//返回1
echo preg_match('/[A-Z]/','ABC');//返回1
echo preg_match('/[0-9]/','123');//返回1
echo preg_match('/[abc]/', 'a');//返回1
echo preg_match('/[^abc]/', 'd');//返回1
echo preg_match('/[a-zA-Z0-9_]/', 'aD45_');//返回1
echo preg_match('/\w/', 'aD45_');//返回1
echo preg_match('/\W/', 'aD45_');//返回0
echo preg_match('/\d/', '123456');//返回1
echo preg_match('/\D/', '123456');//返回0
echo preg_match('/\d/', '123456');//返回1
echo preg_match('/\s/', ' ');//返回1
echo preg_match('/\S/', ' ');//返回0
//单词尾部边界
echo preg_match('/at\b/', 'cat');//返回1
//头单词部边界
echo preg_match('/\bat/', 'attribute');//返回1
//没有到达边界
echo preg_match('/\Bat/', 'attribute');//返回0
//特殊字符 $ ^ * () + = {} [] | \\ : <>
echo preg_match('/\$/', '$');//返回1
修饰符
修饰符 说明
i 完全不区分大小写
m 可以采用多行识别,遇到换行也承认匹配规则
x 忽略掉规则模式中的空白字符
A 强制从头开始匹配
U 禁止贪婪匹配,只跟踪到最近的一个匹配符并结束
//修饰符
//i 不区分大小写
echo preg_match('/abcd/','AbcD');//返回0
echo preg_match('/abcd/i','AbcD');//返回1
//m 多行识别
$str = '1a
1a';
preg_match_all('/^1a/',$str,$arr);
print_r($arr);
//结果为Array ( [0] => Array ( [0] => 1a ) )
//默认从头到尾匹配,所以只匹配到一个
preg_match_all('/^1a/m',$str,$arr);//返回1
print_r($arr);
//结果为Array ( [0] => Array ( [0] => 1a [1] => 1a ) )
//每行都会使用规则,所以匹配的到二个,注意第二行前面不要有空格避免干扰
//x 忽略模式的空格
echo preg_match('/a b/','ab');//返回0
echo preg_match('/a b/x','ab');//返回1
//A 强制开头匹配
echo preg_match('/ab/','catabc');//返回1
echo preg_match('/ab/A','catabc');//返回0
echo preg_match('/ab/A','abcdef');//返回1
//U 禁止贪婪匹配
preg_match_all('/php\w+php/','php123phpphp456php',$arr);
print_r($arr);
//结果为Array ( [0] => Array ( [0] => php123phpphp456php ) )
preg_match_all('/php\w+php/U','php123phpphp456php',$arr);
print_r($arr);
//结果为Array ( [0] => Array ( [0] => php123php [1] => php456php ) )
//禁止贪婪匹配后,会就近匹配
三、Perl风格函数
1、preg_grep()
搜索数组中的所有元素,返回与某个模式匹配的字符串数组
2、preg_match()
搜索模式,匹配返回true,不匹配返回false
3、preg_match_all()
在字符串匹配模式的所有出现,然后将所有匹配的全部放入数组
4、preg_quote()
将特殊字符转义
特殊字符包含 $ ^ * () + = {} [] | \ : <>
定界正则,在每一个对于正则表达式语法而言有特殊含义的字符前插入一个反斜杠
5、preg_replace()
替换模式的所有出现,然后替换成想要的字符串返回出来
6、preg_split()
以不区分大小写将字符串划分不同的元素
//风格函数
//preg_grep()
$arr = array('php5','php6','php7','css','html');
$out = preg_grep('/php[0-9]/', $arr);
print_r($out);
//结果为Array ( [0] => php5 [1] => php6 [2] => php7 )
//preg_match()
echo preg_match('/php[0-9]/','php5');//返回1
//preg_match_all()
preg_match_all('/php[0-9]/','php5php6php7',$arr);
print_r($arr);
//结果为Array ( [0] => Array ( [0] => php5 [1] => php6 [2] => php7 ) )
//preg_quote()
echo preg_quote(' $ ^ * () + = {} [] | \\ : <>');
//结果为 \$ \^ \* \(\) \+ \= \{\} \[\] \| \\ \: \<\>
//preg_replace()
echo preg_replace('/php/','python', 'php1php2php3');
//结果为 python1python2python3
//preg_split()
$str = preg_split('/a/', 'cbabc');
print_r($str);
//结果为rray ( [0] => cb [1] => bc )
html匹配:
$part="<td><a href='baidu.com'>中国人</a><a href='baidu2.com'>美国人</a></td>";
preg_match_all("/<td>.*<\/td>/",$part,$matches);
preg_match_all("/<a href=\'(.*?)\'>(.*?)<\/a>/",$matches[0][0],$matche2);
var_dump($matche2);
//显示结果:
array(3) { [0]=> array(2) { [0]=> string(33) "中国人" [1]=> string(35) "美国人" } [1]=> array(2) { [0]=> string(9) "baidu.com" [1]=> string(10) "baidu2.com" } [2]=> array(2) { [0]=> string(9) "中国人" [1]=> string(10) "美国人" } }
如果字符串有多个a标签,正则表达式不加 ? 则匹配结果不对