请教正则表达式#(\d)+#i 与 #(\d+)#i 的区别详解
2013-11-27 来自:答案风中飘扬 4 人回应

程序1:

  
<?php
$str='13461081@qq.com1111111@163.com';
$preg='#(\d)+#i';
preg_match_all($preg,$str,$res);
echo '<pre>';
print_r($res);
echo '</pre>';
?>

结果1:

  
<pre>Array
(
[0] => Array
(
[0] => 13461081
[1] => 1111111
[2] => 163
)

[1] => Array
(
[0] => 1
[1] => 1
[2] => 3
)

)
</pre>

程序2:

  
<?php
$str='13461081@qq.com1111111@163.com';
$preg='#(\d+)#i';
preg_match_all($preg,$str,$res);
echo '<pre>';
print_r($res);
echo '</pre>';
?>

结果2:

  
<pre>Array
(
[0] => Array
(
[0] => 13461081
[1] => 1111111
[2] => 163
)

[1] => Array
(
[0] => 13461081
[1] => 1111111
[2] => 163
)

)
</pre>

想请教的是, 程序1结果中的子表达式"(\d)+" 怎么匹配出了'3'?

#(\d)+#i 与 #(\d+)#i的区别是什么?

2013-12-01 来自:利卫旦,
$preg='#(\d)+#i';

匹配成功了3次,即“13461081”,“1111111”,“163”。
子分组为一次匹配中的单个数字,
在匹配“13461081”时,分组(\d)的变化过程为 1->3->4...->1
在匹配“1111111”时,分组(\d)的变化过程为 1->1->1...->1
在匹配“163”时,分组(\d)的变化过程为 1->6->3
所以匹配完成时得到,Array(1,1,3)

$preg='#(\d+)#i';

同样是匹配成功了3次,子分组为整个正则模式,
在匹配“13461081”时,分组(\d+)的变化过程为 1->13->134...->13461081
在匹配“1111111”时,分组(\d+)的变化过程为 1->11->111...->1111111
在匹配“163”时,分组(\d+)的变化过程为 1->16->163
所以匹配完成时得到,Array(13461081,1111111,163)

2013-11-30 来自:八月四日

首先你需要明白正则“()”的含义,你使用preg_match_all()函数,$res数组第二个值即为正则“()”匹配的值。

<?php
$str='13461081@qq.com1111111@163.com';

$preg='#(?:\d+)#i'; // 前面加?:,返回值中将没有‘()’匹配出来的字符

preg_match_all($preg,$str,$res);
echo '<pre>';
print_r($res);
echo '</pre>';

结果:

Array
(
[0] => Array
(
[0] => 13461081
[1] => 1111111
[2] => 163
)

)
2013-11-28 来自:sunshine!
  
$preg='#(\d)+#i';
2013-11-28 来自:ziweiyue

首先你需要明白正则“()”的含义,你使用preg_match_all()函数,$res数组第二个值即为正则“()”匹配的值。

  
<?php
$str='13461081@qq.com1111111@163.com';

$preg='#(?:\d+)#i'; // 前面加?:,返回值中将没有‘()’匹配出来的字符

preg_match_all($preg,$str,$res);
echo '<pre>';
print_r($res);
echo '</pre>';

您的回应

你还未登陆,不能回应!登陆