####1,元字符
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
####2,重复
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
\{n\} 重复 n 次
\{n,\} 重复 n 次或更多次
\{n,m\} 重复 n 次到 m 次
####3,常用的反义
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
#####练习1 验证$eamil的合法性
$email = array('12345678@qq.com','1212121212.com','hahahaha','Asw@zj.gov.cn','Asw@zj.info');
$pattern = '/^[a-z0-9_]+@(?:[a-z0-9_-]+\.)+(?:com|cn)/i'; // (exp)匹配并捕获 (?:exp)匹配
foreach ($email as $key => $value) {
if(preg_match($pattern, $value)){
echo $value , ' pass' , PHP_EOL;
}else{
echo $value , ' fail' , PHP_EOL;
}
//preg_match($pattern, $value , $RESULT[$key]);
}
var_dump($RESULT);
输出:
444371889@qq.com pass
1212121212.com fail
hahahaha fail
Asw@zj.gov.cn pass
Asw@zj.info fail
#####练习2 匹配出正确的时间
$str = "
13:00
212:36w ww22:48kl
4:32 这样的时间应该是正确的
22:00
23:59
22:61
1112:13 非法
43:33 非法
12:60
12:33
000:34
00:00
23:59
24:59 显然没有这样的时间
24:00
30
";
$pattern = '/[0-2]{1}[0-3]{1}:[0-5]{1}[0-9]{1}/';
preg_match_all($pattern, $str , $res);
var_dump($res);
输出:
array(1) {
[0]=>
array(10) {
[0]=>
string(5) "13:00"
[1]=>
string(5) "12:36"
[2]=>
string(5) "22:48"
[3]=>
string(5) "22:00"
[4]=>
string(5) "23:59"
[5]=>
string(5) "12:13"
[6]=>
string(5) "12:33"
[7]=>
string(5) "00:34"
[8]=>
string(5) "00:00"
[9]=>
string(5) "23:59"
}
}
可是我们并没有 “4:32 这样的时间应该是正确的” 这个正确的时间
是时候用到分支了
$pattern = '/[0-2]{1}[0-9]{1}:[0-5]{1}[0-9]{1}|[0-9]{1}:[0-5]{1}[0-9]{1}/';
注意 匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
举例:
\d{5}-\d{4}|\d{5} //匹配类似 23843-3234 或 21234 美国邮编格式
//美国邮编的规则是5位数字,或者用连字号间隔的9位数字
如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。
####取反义
<a[^>]+>
匹配用尖括号括起来的以a开头的字符串。
匹配以 除 a 标签以外的标签
#匹配以 除 a 标签以外的元素
$str = '<a>baidu</a>
<a href="http://baidu.com"></a>
<a href="baidu.com"></a>
<span>baidu</span>
<div>hahahaha</div>
<font color="red">121</font>';
$pattern = '/<[^a\/].*/i';
preg_match_all($pattern, $str, $matches);
var_dump($matches);
输出:
array(1) {
[0]=>
array(3) {
[0]=>
string(19) "<span>baidu</span> "
[1]=>
string(20) "<div>hahahaha</div> "
[2]=>
string(28) "<font color="red">121</font>"
}
}
####后向引用
后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本,举例:
从字符串中找出重复出现的单词
$str = 'hello kit kit , let`s go to play basketball , go go go';
$pattern = '/\b(\w+)\b\s+\1\b/i';
preg_match_all($pattern, $str, $matches);
var_dump($matches);
输出:
array(2) {
[0]=>
array(2) {
[0]=>
string(7) "kit kit"
[1]=>
string(5) "go go"
}
[1]=>
array(2) {
[0]=>
string(3) "kit"
[1]=>
string(2) "go"
}
}
####常用分组语法
捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
捕获 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
捕获 (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号