<?
$a='|info(-(page\d+)_(\d+))*\.html|';
$b=array(
"info.html",
"info-page11_22.html",
"info-page33_44.html",
"info-page1_2-page3_4.html",
"info-page3_4-page1_2.html",
);
foreach($b as $key=>$val){
preg_match_all($a,$val,$val);
print_r($val);
}最后两个,没有匹配出page1_2和page3_4

解决方案 »

  1.   

    最后两个应该匹配出四项,但是实际上只匹配出最后一个pagex_x。对吧。
      

  2.   

    $a='|info(-(page\d+)_(\d+))*\.html|';    改成$a='|info(-(page\d+)-(\d+))*\.html|';
      

  3.   

    :-),do some simple test
    ===========================
    $x = '-1-2-3-4-5';
    //preg_match_all('/(-\d)*/',$x,$m);//匹配字符串本身,和最后一个-\d
    preg_match_all('/-\d/',$x,$m);//匹配所有-\d
    print_r($m);exit;
      

  4.   

    楼上几个好像都没搞清楚楼主的目的,君子兰的正则没有错
    只是期望中间某个子匹配()能在数组中全部反应出来,结果却只显示了多次匹配的最后一个想知道php是不是有些什么规定对多次匹配只显示最后一个呢?
    例如/a(b)+c/ 匹配“abbbbbbbbbbbbbc”为何只显示一个b呢?
      

  5.   

    改成这样能显示所有的
     $a='|-(page\d+)_(\d+)|';当然这个把前面的info和后面的.html去掉了,
    也许可以先preg_match一下前后的info和html,
    然后在用preg_match_all匹配内部的?
      

  6.   

    to helloyou0(你好!) :没用的。我这个是给重写用的。没法去掉头尾,必须带着。to楼上:试过U修饰符,没用。
      

  7.   

    $a='|info((-(page\d+)_(\d+))*)\.html|';再在外面加个括号就OK了啊