关于 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". 预查不消耗字符, 也就是说, 在一个匹配发生后, 在最后一次匹配之后立即开始下一次匹配的搜索, 而不是从包含预查的字符之后开始
来源: http://www.bubuko.com/infodetail-2881059.html