php正则式求解解释!

/(?:(?: \(([\d]+)\))?(\.[^.]+))?$/
是什么意思?
求详解。
正确的话,更多分分送上!

我们来一条条的分析,正则这样分析最容易了:


    先来看前面的无名表达式中间的  [\d]+  相信这个有点正则经验的都知道,它是表示连续至少一个数字的字符串;

    再看它外面一圈: \(([\d]+)\)  这个是表示带了括号的至少一个数字的字符串,比如:"(554)"就符合它的要求;

    再来看它再外面的一圈  (?:表达式) 这样的语法,这个我们称之为无名表达式,它可以占一个括号,却不会被子匹配所捕获;也就是说,它里面的值在 \1\2或者是$1$2中不会因为用了括号而出现,但它里面的括号还是会被子匹配的。但要注意的是,冒号的前面有一个空格,这个空格也是要求被匹配的,也就是说,在包含了数字的括号前面,要有一个空格,这个数字和括号才会被匹配;

    再外面的,又出现了一个无名表达式,这个浪费了,没用。

    (?:(?: \(([\d]+)\))?  最后面的   ?   ,这个表示这个无名表达式中的内容可有可无,有的话只限一次,要么就没有。

    再看后面  [^.]+  这个表达式,它的写法很有意思,我们都知道在正则中 .  这个符号是不匹配换行的,其它的统统拿下,所以,这么用就表达匹配换行符,后面的 + 表示至少一个,上不封顶。那么,它表示匹配出现一次或者多次的换行,这个还可以用  [\r\n]+  来代替;

    再看它外围,(\.[^.]+)?  这个表达式表示,以换行结尾,换行前面有一个点,“.”的前面加上“\”表示这个符号本身,也就是点了,至于后边的问号,与第5条后面的问号意思一样;

    最后的$表示是被匹配字符串的末尾,也就代表着,这个正则表达式只匹配出现在整个字符串最末尾的部分,如果出现在字符串中间,则不会被匹配;


最后,我举出几个典型的能够被这条表达式匹配出来的字符串形式:


    空字符串

    任何字符串最后的空串

    任何字符串最后的点加上换行

    空格+括号包含一个以上数字,再加上后面紧跟一个点,点后面还必须有换行的字符串;



下面是代码实例:(这里的代码中有多行的会被自动过滤,所以有些不准确)

$a = array(
' (01111).
', //全部匹配
'(0222).
', //只匹配点加上换行(因为没有空格不会匹配(0222))
' (0333333).



',  //匹配 空格加上(0333333)加上点加上若干个换行
' (044)', //匹配空字符串,因为空格加上(044)是相当于预判的无名表达式,所以后面如果没有跟随有意义的匹配,那么不对无名表达式进行匹配;
'',       //匹配空字符串
'fdsa432',  //匹配空字符串
'魂f.
', //匹配点加上换行
'ac (55)a' //匹配空字符串
);

foreach($a as $k=>$v){
if(preg_match("/(?:(?: \(([\d]+)\))?(\.[^.]+))?$/", $v, $re)){
var_dump($re);
}
}


输出:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-12
\表示转义,如 \( 就表示字符 (
\d表示匹配一个0-9的数,等同于[0-9],[\d]用法就不太对了,直接\d就行了,
[]表示匹配指定的元素,如[a-z], [012]等
()表示一个分组,如 preg_match_all($pattern, $content, $matches),那么最终匹配出来的结果$matches变量中就会多一个下标,一个分组对应1-2个下标(一个数字下标和如果有命名的话还有命名的下标),如此就能获取到这个组匹配的内容。
这里([\d]+)表示匹配一个数字,这个数字的位数大于等于1.
\(([\d]+)\)就表示用括号括起来的数字:如(123)
(?:)表示不占位分组,即分组了,但$matches中不会出现这个组的下标,这样也就获取不到这个组的内容
?表示最小匹配,如果没有这个默认是贪婪匹配,这个比如HTML标签匹配代码如:/\<(.*?)\>/,HTML内容如<a name="1"></a><a name="2></a>
正常()应该匹配多个:1. a name="1", 2. /a, 3. a name="2", 4. /a
如果不加?,则结果就变成只有匹配到1个: a name="1"></a><a name="2"></a
\.表示匹配.号,而.表示匹配任意字符,这个还跟修饰符有关,具体你要看文档了
[^]表示匹配非指定的元素内的元素,这里[^.]表示匹配除.外的内容,这里这个写法可能是错误的,因为正常应该是 [^\.]
整的这个匹配意思:就是匹配如下格式的内容:(数字).任意多个非点的字符
第2个回答  2013-06-12
只匹配(数字).除.的任意字符 如(45454545454).fdsfsdfdsf
//$str = "(1111).fdsfdsfskj" ;
$str = "(1111).fdsfdsfskj(2222).aaaaa" ;

preg_match_all('/(?:(?:\(([\d]+)\))?(\.[^.]+))?$/',$str,$out) ;
echo "<pre>" ;
var_dump($out) ;
echo '</pre>' ;
运行一下,你就知道了
相似回答