学好正则表达式需要注意的几点
关于preg_match 和preg_match_all 函数结果的说明
php代码为:
<?php
$str = "sdh111-757-111fkjhgjkiu888-060-888ygndfhdsuifyiud";
$reg = '/(\d)\1{2}-(\d)\d\2-\1{3}/i';
//preg_match($reg,$str,$res);
preg_match_all($reg,$str,$res);
var_dump($res);
?>
preg_match结果为:
Array
(
[0] => 111-575-111
[1] => 1
[2] => 5
)
如果使用的是preg_match函数,匹配的结果是,只匹配一个结果
$res[0] 就是匹配到的内容
$reg[1] 就是第一个子表达式的内容
$reg[n] 就是第n个子表达式的内容
preg_match_all结果为
1:子表达式
就是在正则表达式中()里面的表达式,这些括号中的表达式匹配到的元素,会被捕获到内存中,就是上面preg_match和preg_match匹配的数组中除第一个以外的数组部分。
2:捕获 (请注意,如果你的正则表达式中有子表达式,则,正则表达式使用单引号括起来)
3:反向引用
上面的例子中的这个正则表达式:
$reg = '/(\d)\1{2}-(\d)\d\2-\1{3}/i';
这个正则表达式中就用到了反向引用,其中 \1 \2 都是反向引用,代表的是第一个、第二个子表达式匹配到的内容。
特殊的说明:
在正则规范中,我们可能会 看到 (?: pattern) (?! patter) (?<!pattern) (?=pattern) (?<=pattern)
(?: pattern) 非捕获匹配
这些特殊的表达式是正则中的 环视 有兴趣可以网上搜索学习。
表达式 说明
(?<=pattern) 逆序肯定环视,表示所在位置左侧能够匹配Expression
(?<!pattern) 逆序否定环视,表示所在位置左侧不能匹配Expression
(?=pattern) 顺序肯定环视,表示所在位置右侧能够匹配Expression
(?!pattern) 顺序否定环视,表示所在位置右侧不能匹配Expression
参考说明文档:
(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始