1.子模式问题
代码1:
$p='#((a)|b)\d#'; $str="b2a1"; preg_match_all($p,$str,$arr);
结果:
Array
(
[0] => Array
(
[0] => b2
[1] => a1
)
[1] => Array
(
[0] => b
[1] => a
)
[2] => Array
(
[0] =>
[1] => a
)
)
$p='#((a)|(b))\d#'; $str="b2a1"; preg_match_all($p,$str,$arr);
对于带多个括号的子模式((a)(b)c) 子模式的顺序是c a b从外到内,从左 到右
结果:
Array
(
[0] => Array
(
[0] => b2
[1] => a1
)
[1] => Array
(
[0] => b
[1] => a
)
[2] => Array
(
[0] =>
[1] => a
)
[3] => Array
(
[0] => b
[1] =>
)
)
$p='#(?:(a)|(b))\d#'; $str="b2a1"; preg_match_all($p,$str,$arr); print_r($arr);
2.反斜杠匹配问题
模式
‘#\\\#’ 去匹配反斜杠
里面\的个数和匹配结果,以10个以内为例
\的个数 |
匹配结果 |
1 |
不匹配 |
2 |
不匹配 |
3 |
匹配1个\ |
4 |
匹配1个\ |
5 |
不匹配 |
6 |
不匹配 |
7 |
匹配2个\ |
8 |
匹配2个\ |
9 |
不匹配 |
10 |
不匹配 |
我理解的对有些解释的通,有些解释不通
首先要经过字符串层面的转义
比如拿1个\的
在字符串层面由于\是转义字符,在字符串层面把结尾分割符转义了#,就缺少了分割符
2个\\
在字符串层面,两个\\转义后成为一个无意义的\
通过此层
然后进入正则层面
一个无意义的\(相对字符串来说)进入正则后,正则认为\具有转义功能
,就认为它又把#转义了,就又出错
每个层面只转义一次
对于4个的,在字符串层面先转为2个都无意义的\,然后进入正则,后被正则识别为2个有转义意义的\然后2个有意义的转为1个无意义的\成为最终匹配的模式拿去匹配
这种理解只适合\个数为1,2,4,5,6,8,9,10
为什么呢?