我们来一条条的分析,正则这样分析最容易了:
先来看前面的无名表达式中间的 [\d]+ 相信这个有点正则经验的都知道,它是表示连续至少一个数字的字符串;
再看它外面一圈: \(([\d]+)\) 这个是表示带了括号的至少一个数字的字符串,比如:"(554)"就符合它的要求;
再来看它再外面的一圈 (?:表达式) 这样的语法,这个我们称之为无名表达式,它可以占一个括号,却不会被子匹配所捕获;也就是说,它里面的值在 \1\2或者是$1$2中不会因为用了括号而出现,但它里面的括号还是会被子匹配的。但要注意的是,冒号的前面有一个空格,这个空格也是要求被匹配的,也就是说,在包含了数字的括号前面,要有一个空格,这个数字和括号才会被匹配;
再外面的,又出现了一个无名表达式,这个浪费了,没用。
(?:(?: \(([\d]+)\))? 最后面的 ? ,这个表示这个无名表达式中的内容可有可无,有的话只限一次,要么就没有。
再看后面 [^.]+ 这个表达式,它的写法很有意思,我们都知道在正则中 . 这个符号是不匹配换行的,其它的统统拿下,所以,这么用就表达匹配换行符,后面的 + 表示至少一个,上不封顶。那么,它表示匹配出现一次或者多次的换行,这个还可以用 [\r\n]+ 来代替;
再看它外围,(\.[^.]+)? 这个表达式表示,以换行结尾,换行前面有一个点,“.”的前面加上“\”表示这个符号本身,也就是点了,至于后边的问号,与第5条后面的问号意思一样;
最后的$表示是被匹配字符串的末尾,也就代表着,这个正则表达式只匹配出现在整个字符串最末尾的部分,如果出现在字符串中间,则不会被匹配;
最后,我举出几个典型的能够被这条表达式匹配出来的字符串形式:
空字符串
任何字符串最后的空串
任何字符串最后的点加上换行
空格+括号包含一个以上数字,再加上后面紧跟一个点,点后面还必须有换行的字符串;
下面是代码实例:(这里的代码中有多行的会被自动过滤,所以有些不准确)
$a = array(输出: