自我总结的正则难点
1.正则符号 . 需要转义 | 限制符号 等等
2.用#做定界符时对/不转义
3.修饰符号:用于改变正则表达式的行为
(1)i代表忽略大小写
(2)x忽略空格
(3)
4.^脱字符号
(1)^放在字符域中(如:[^w])表示不包括的意思
(2)放在字符的前面表示以这个字符开始
5.通配符
(1)正向预查:(?=)相对应的(?!)表示否定意思
(2)反向预查:(?<=)相对应的(?<!)表示否定意思
前后紧跟字符
预查:对字符串前后的字符规则加限制
正向预查:
$regex = '/(?<=c)d(?=e)/';
$str = 'abcdefg';
if (preg_match($regex,$str,$matchs)) {
var_dump($matchs);
}
反向预查:
$regex = '/(?<!c)d(?!e)/';
$str = 'asdwerfcde';
if (preg_match($regex,$str,$matchs)) {
var_dump($matchs);
}
字符宽度0
验证零字符代码
$regex = '/^H(?<=E)L(?=L)O$/';
$str = 'hello';
if (preg_match($regex,$str,$matchs)) {
var_dump($matchs);
} // 打印不出结果!
$regex = '/HE(?=L)LLO/i';
$str = 'HELLO';
if (preg_match($regex,$str,$matchs)) {
var_dump($matchs);
}
说明(?=L)意思是HE后面紧跟一个L字符。但(?L)本身不占字符 要与(L)区分
6.捕获数据
没有指明类型而进行的分祖,将会被获取,供以后使用
(指明类型的分组是指通配符号,只有起始位置只有圆括号没有?的才能被捕捉)
调用格式 :编号 如1
$regex = '/^(abc)[s]1$/i'; //注:在abc前加?:(如(?:abc)) 则 /1不能捕捉到数据 即数据1已经被避免捕捉
$str = 'abc abc';
if (preg_match($regex,$str,$matchs)) {
var_dump($$matchs);
}
括号里的数据(abc)会被存进数据(内存)
然后以 /编号 的形式被捕捉
7.命名捕捉组
如果组太多可以采用已命名的方式捕捉数据哦
格式:(?P<组名>)
调用方式:(?P=组名)
$regex = '/^(?P<name>abc)[s](?P=name)$/i';
$str = 'abc abc';
if (preg_match($regex,$str,$matchs)) {
var_dump($matchs);
}
E:wamp64wwwfirst day preg_matchprege_match.php:49:
array (size=3)
0 => string 'abc abc' (length=7)
'name' => string 'abc' (length=3)
1 => string 'abc' (length=3)
8.惰性匹配
原理:如果'?'前面有限定符号则使用最小的数据 如*会取0个 +取一个 {1,2}取一个1个
$regex = '/^abc*?$/i';
$str = 'abcccccccc';
if (preg_match($regex,$str,$matchs)) {
var_dump($matchs);
}
9.正则表达式的注释
格式:(?#注释内容)
用途:主要用于复杂的注释
举个例子
如MYSQL连接数据库时
$regex = '/^host=(?<!.)([d.])+(?!.)(?#主机地址)|([w@#$%*()_+-]+)(?#用户名)|([w@#$%*()_+-]+)(?#密码)(?!|)$/ix';
$str = 'host=192.168.10.221|root|123456';
if (preg_match($regex,$str,$matchs)) {
var_dump($matchs);
}
0 => string 'host=192.168.10.221|root|123456' (length=31)
1 => string '192.168.10.221' (length=14)
2 => string 'root' (length=4)
3 => string '123456' (length=6)
键位0代表匹配最长的值
其余键位的值代表每个数据组里面匹配到的值 如([d.])+(?!.)匹配存储的值是$str里面的'192.168.10.221'
10.特殊字符
* 0次到多次
+ 1次到多次
? 0次到一次
. 匹配换行符号以外的当个字符
*. 匹配换行符号以外的所有字符
w 字母数字 [a-zA-Z0-9]
s 匹配空白字符 空格 换行 回车
d 数字 [0-9]