一、正则表达式语法规则
描述了一类字符串的特征,然后通过这个特征可以配合一些特定的函数,来完成对字符串更加复杂的一系列操作!
普通字符和特殊字符组成的一个字符串
print_r($matches);
二、定界符
我们一般习惯使用正斜线"/"作为定界的字符,前后一致
三、普通字符
四、元字符
\d 匹配任意一个十进制数字,等价于[0-9]
\D 匹配任意一个除十进制数字以外字符,等价于[^0-9]
\s 匹配任意一个空白字符,比如换页符、换行符、回车符、制表符、垂直制表符
\S 匹配除空白字符以外的任何一个字符
\w 匹配任意一个数字或字母或下划线
\W 匹配除数字、字母、下划线以外的任意一个字符
. 匹配除换行符以外的任意一个字符
* 匹配0次、或1次、或多次其前面的字符
+ 匹配1次或多次其前面的字符
? 匹配0次或1次其前面的字符
{n} 表示其前面字符恰好出现n次
{n,} 表示其前面字符出现不少于n次
{n,m} 表示其前面的字符至少出现n次,最多出现m次
^或\A 匹配字符串开始位置
$或者\Z 匹配字符串的结束位置
| 匹配两个或多个模式
[] 匹配方括号中的任意一个字符
[^] 匹配除方括号中字符以外的任意一个字符
() 将括号中作为一个整体以便将其中的内容获取到
在我们的正则表达式中 可以使用圆括号来将某一段括起来,在圆括号的后面部分,我们可以使用
\\数字 来代表圆括号部分所匹配到的内容!
举例:
// \d 匹配任意一个十进制数字,等价于[0-9]
$patt="/t\dst/";
$myString ="zhongguorent0stzhongguorentest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// 只想匹配普通的.(点)
// \转义字符,把原来正则表达式的.(点)转成了普通的.(点)
$patt="/t\.st/";
$myString ="zhong.guorent0stzhongguorentest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//* 匹配0次、或1次、或多次其前面的字符
$patt="/te*st/";
$myString ="zhteeeest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//+ 匹配1次或多次其前面的字符
$patt="/te+st/";
$myString ="zhteeeest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//? 匹配0次或1次其前面的字符
$patt="/te?st/";
$myString ="zhtst";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//{n} 表示其前面字符恰好出现n次
$patt="/te{2}st/";
$myString ="zhteest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//{n,} 表示其前面字符出现不少于n次
$patt="/te{2,}st/";
$myString ="zhtest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//{n,m} 表示其前面的字符至少出现n次,最多出现m次
$patt="/te{2,5}st/";
$myString ="zhteeest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//.与{n}的配合
$patt='/t.{3}st/'; //t...st
$myString ="zhteeest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//.与{*}配合
$patt='/t.*st/'; //tst
$myString ="zhtst";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//.与{*}配合
//贪婪匹配
$patt='/t.*st/'; //tst
$myString ="zhteeestdddtmmmst";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//.与{*}配合
//加?指的是懒惰匹配
$patt='/t.*?st/'; //tst
$myString ="zhteeestdddtmmmst";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// ^或\A 匹配字符串开始位置
$patt='/^test/'; //tst
$myString ="testdddtmmmst";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// $或者\Z 匹配字符串的结束位置
$patt='/test$/'; //test
$myString ="testdddtmmmtest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// .和$ 配合使用
$patt='/^t.*t$/'; //test
$myString ="testdddtmmmtest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// | 匹配两个或多个模式
$patt='/test|abc|AAA/';
$myString ="dddttestmabcmAAAm";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// [] 匹配方括号中的任意一个字符
$patt='/t[abcde]st/';
$myString ="dddttestmatastbcmAAAm";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//[^] 匹配除方括号中字符以外的任意一个字符
$patt='/t[^e]st/';
$myString ="dddttestmatastbcmAAAm";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// () 将括号中作为一个整体以便将其中的内容获取到
// 在我们的正则表达式中 可以使用圆括号来将某一段括起来,在圆括号的后面部分,我们可以使用
// 数字 来代表圆括号部分所匹配到的内容!
$patt='/t(e)st\\1/'; //\\1代表一地个圆括号部分所匹配到的内容'/teste/'
$myString ="teste";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// () 将括号中作为一个整体以便将其中的内容获取到
// 在我们的正则表达式中 可以使用圆括号来将某一段括起来,在圆括号的后面部分,我们可以使用
// 数字 来代表圆括号部分所匹配到的内容!
$patt='/t(.)(.)t\\1\\2/'; //\\1代表一地个圆括号部分所匹配到的内容'/teste/'
$myString ="testes";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
五、模式修正符
常见模式修正符
i 在和模式进行匹配时不区分大小写
m 多行匹配,如果目标字符串 中没有"\n"字符, 或者模式中没有出现^或$, 设置这个修饰符不产生任何影响
s 如果设定了此修正符,那么.将匹配所有的字符包括换行符
U 禁止贪婪匹配
// i 在和模式进行匹配时不区分大小写
$patt='/test/i';
$myString ="test Test TEST tEst";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// 多行匹配,如果目标字符串 中没有"\n"字符, 或者模式中没有出现^或$, 设置这个修饰符不产生任何影响
// 使用条件:
// 1目标字符串中必须包含"\n",在字符串中出现"\n"表示新的一行开始
// 2正则表达式中必须出现^或者$
$patt='/^test/m';
$myString ="test\ntest\ntest\ntest";
// 这种写法是换行是不起作用的
// 因为在windows操作系统下你所看到的换行现象其实是由(\r\n)来完成的
// $myString ="test"
// . "test"
// . "test"
// . "test";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// s 如果设定了此修正符,那么.将匹配所有的字符包括换行符
$patt='/t.st/s';
$myString ="t\nst";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// U 禁止贪婪匹配
$patt='/t.*t/U'; //等价于$patt='/t.*?t/';
$myString ="tkoijihuygyt tjojot";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// 模式修正符,可以多个使用,顺序没关系
$patt='/t.*t/iU'; //等价于$patt='/t.*?t/';
$myString ="TKoijihuygyt tjojot";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
六、与正则表达式配合的函数
preg_match_all()
// preg_match_all() 函数用于进行正则表达式全局匹配,成功返回整个模式匹配的次数(可能为零),如果出错返回 FALSE 。
$patt="/test/";
$myString ="zhtest";
var_dump(preg_match_all($patt, $myString, $matches));
preg_match()
preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。
$patt='/t(.*?)st/';
$myString ="test teeeeest ";
var_dump(preg_match($patt, $myString, $matches));
var_dump($matches);
preg_replace() 函数用于正则表达式的搜索和替换。
$patt='/<div>(.*?)<\/div>/';
$str1= "<a>$1</a>";
$myString ="t<div>estteeeee</div>st ";
var_dump(preg_replace($patt, $str1, $myString));
常用正则表达式:
//1匹配邮箱
$str = '584816642@qq.com';
$isMatched = preg_match('/\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/', $str, $matches);
var_dump($isMatched, $matches);
//2匹配手机号
$str = '13012870395';
$isMatched = preg_match('/(13\d|14[57]|15[^4,\D]|17[678]|18\d)\d{8}|170[059]\d{7}/', $str, $matches);
var_dump($isMatched, $matches);
//匹配整份证号
$str = '610321199111113411';
$isMatched = preg_match('/\d{15}|\d{17}[0-9Xx]/', $str, $matches);
var_dump($isMatched, $matches);
//匹配车牌号
$patt="/[\x80-\xff]+[A-Z][0-9a-zA-Z]{5}/";
$myString ="陕A88888";
var_dump(preg_match_all($patt, $myString, $matches));
描述了一类字符串的特征,然后通过这个特征可以配合一些特定的函数,来完成对字符串更加复杂的一系列操作!
普通字符和特殊字符组成的一个字符串
print_r($matches);
二、定界符
我们一般习惯使用正斜线"/"作为定界的字符,前后一致
三、普通字符
四、元字符
\d 匹配任意一个十进制数字,等价于[0-9]
\D 匹配任意一个除十进制数字以外字符,等价于[^0-9]
\s 匹配任意一个空白字符,比如换页符、换行符、回车符、制表符、垂直制表符
\S 匹配除空白字符以外的任何一个字符
\w 匹配任意一个数字或字母或下划线
\W 匹配除数字、字母、下划线以外的任意一个字符
. 匹配除换行符以外的任意一个字符
* 匹配0次、或1次、或多次其前面的字符
+ 匹配1次或多次其前面的字符
? 匹配0次或1次其前面的字符
{n} 表示其前面字符恰好出现n次
{n,} 表示其前面字符出现不少于n次
{n,m} 表示其前面的字符至少出现n次,最多出现m次
^或\A 匹配字符串开始位置
$或者\Z 匹配字符串的结束位置
| 匹配两个或多个模式
[] 匹配方括号中的任意一个字符
[^] 匹配除方括号中字符以外的任意一个字符
() 将括号中作为一个整体以便将其中的内容获取到
在我们的正则表达式中 可以使用圆括号来将某一段括起来,在圆括号的后面部分,我们可以使用
\\数字 来代表圆括号部分所匹配到的内容!
举例:
// \d 匹配任意一个十进制数字,等价于[0-9]
$patt="/t\dst/";
$myString ="zhongguorent0stzhongguorentest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// 只想匹配普通的.(点)
// \转义字符,把原来正则表达式的.(点)转成了普通的.(点)
$patt="/t\.st/";
$myString ="zhong.guorent0stzhongguorentest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//* 匹配0次、或1次、或多次其前面的字符
$patt="/te*st/";
$myString ="zhteeeest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//+ 匹配1次或多次其前面的字符
$patt="/te+st/";
$myString ="zhteeeest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//? 匹配0次或1次其前面的字符
$patt="/te?st/";
$myString ="zhtst";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//{n} 表示其前面字符恰好出现n次
$patt="/te{2}st/";
$myString ="zhteest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//{n,} 表示其前面字符出现不少于n次
$patt="/te{2,}st/";
$myString ="zhtest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//{n,m} 表示其前面的字符至少出现n次,最多出现m次
$patt="/te{2,5}st/";
$myString ="zhteeest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//.与{n}的配合
$patt='/t.{3}st/'; //t...st
$myString ="zhteeest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//.与{*}配合
$patt='/t.*st/'; //tst
$myString ="zhtst";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//.与{*}配合
//贪婪匹配
$patt='/t.*st/'; //tst
$myString ="zhteeestdddtmmmst";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//.与{*}配合
//加?指的是懒惰匹配
$patt='/t.*?st/'; //tst
$myString ="zhteeestdddtmmmst";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// ^或\A 匹配字符串开始位置
$patt='/^test/'; //tst
$myString ="testdddtmmmst";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// $或者\Z 匹配字符串的结束位置
$patt='/test$/'; //test
$myString ="testdddtmmmtest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// .和$ 配合使用
$patt='/^t.*t$/'; //test
$myString ="testdddtmmmtest";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// | 匹配两个或多个模式
$patt='/test|abc|AAA/';
$myString ="dddttestmabcmAAAm";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// [] 匹配方括号中的任意一个字符
$patt='/t[abcde]st/';
$myString ="dddttestmatastbcmAAAm";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
//[^] 匹配除方括号中字符以外的任意一个字符
$patt='/t[^e]st/';
$myString ="dddttestmatastbcmAAAm";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// () 将括号中作为一个整体以便将其中的内容获取到
// 在我们的正则表达式中 可以使用圆括号来将某一段括起来,在圆括号的后面部分,我们可以使用
// 数字 来代表圆括号部分所匹配到的内容!
$patt='/t(e)st\\1/'; //\\1代表一地个圆括号部分所匹配到的内容'/teste/'
$myString ="teste";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// () 将括号中作为一个整体以便将其中的内容获取到
// 在我们的正则表达式中 可以使用圆括号来将某一段括起来,在圆括号的后面部分,我们可以使用
// 数字 来代表圆括号部分所匹配到的内容!
$patt='/t(.)(.)t\\1\\2/'; //\\1代表一地个圆括号部分所匹配到的内容'/teste/'
$myString ="testes";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
五、模式修正符
常见模式修正符
i 在和模式进行匹配时不区分大小写
m 多行匹配,如果目标字符串 中没有"\n"字符, 或者模式中没有出现^或$, 设置这个修饰符不产生任何影响
s 如果设定了此修正符,那么.将匹配所有的字符包括换行符
U 禁止贪婪匹配
// i 在和模式进行匹配时不区分大小写
$patt='/test/i';
$myString ="test Test TEST tEst";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// 多行匹配,如果目标字符串 中没有"\n"字符, 或者模式中没有出现^或$, 设置这个修饰符不产生任何影响
// 使用条件:
// 1目标字符串中必须包含"\n",在字符串中出现"\n"表示新的一行开始
// 2正则表达式中必须出现^或者$
$patt='/^test/m';
$myString ="test\ntest\ntest\ntest";
// 这种写法是换行是不起作用的
// 因为在windows操作系统下你所看到的换行现象其实是由(\r\n)来完成的
// $myString ="test"
// . "test"
// . "test"
// . "test";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// s 如果设定了此修正符,那么.将匹配所有的字符包括换行符
$patt='/t.st/s';
$myString ="t\nst";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// U 禁止贪婪匹配
$patt='/t.*t/U'; //等价于$patt='/t.*?t/';
$myString ="tkoijihuygyt tjojot";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
// 模式修正符,可以多个使用,顺序没关系
$patt='/t.*t/iU'; //等价于$patt='/t.*?t/';
$myString ="TKoijihuygyt tjojot";
var_dump(preg_match_all($patt, $myString, $matches));
var_dump($matches);
六、与正则表达式配合的函数
preg_match_all()
// preg_match_all() 函数用于进行正则表达式全局匹配,成功返回整个模式匹配的次数(可能为零),如果出错返回 FALSE 。
$patt="/test/";
$myString ="zhtest";
var_dump(preg_match_all($patt, $myString, $matches));
preg_match()
preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。
$patt='/t(.*?)st/';
$myString ="test teeeeest ";
var_dump(preg_match($patt, $myString, $matches));
var_dump($matches);
preg_replace() 函数用于正则表达式的搜索和替换。
$patt='/<div>(.*?)<\/div>/';
$str1= "<a>$1</a>";
$myString ="t<div>estteeeee</div>st ";
var_dump(preg_replace($patt, $str1, $myString));
常用正则表达式:
//1匹配邮箱
$str = '584816642@qq.com';
$isMatched = preg_match('/\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/', $str, $matches);
var_dump($isMatched, $matches);
//2匹配手机号
$str = '13012870395';
$isMatched = preg_match('/(13\d|14[57]|15[^4,\D]|17[678]|18\d)\d{8}|170[059]\d{7}/', $str, $matches);
var_dump($isMatched, $matches);
//匹配整份证号
$str = '610321199111113411';
$isMatched = preg_match('/\d{15}|\d{17}[0-9Xx]/', $str, $matches);
var_dump($isMatched, $matches);
//匹配车牌号
$patt="/[\x80-\xff]+[A-Z][0-9a-zA-Z]{5}/";
$myString ="陕A88888";
var_dump(preg_match_all($patt, $myString, $matches));