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

 

为什么呢?