为什么这个只有两个匹配的,$match里都是什么呢????
按照我的意思理解,是要匹配 一个字母(或数字下划线)后面连续跟四个字母数字或下划线的字符,不应该是两个啊,而且$match数组里的东西实在是看不明白。忘牛人解答!
echo preg_match_all( '/(\w)((?=\1\1\1)(\1))+/' , 'aaa ffffff 999999999',$match );
print_r( $match);

解决方案 »

  1.   

    写的的确很复杂,其中用了一些比较高级的方式.
    (?=pattern)表示正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。
    \num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。放在一起更加的不理解,期待高手.
      

  2.   

    运行结果:
    2Array ( [0] => Array ( [0] => ffff [1] => 9999999 ) [1] => Array ( [0] => f [1] => 9 ) [2] => Array ( [0] => f [1] => 9 ) [3] => Array ( [0] => f [1] => 9 ) ) “\1”表示和第一个括号中的表达式一样
      

  3.   

    呃,LZ你这正则写的实在是具体讲,拿(\w)((?=\1\1\1)(\1))+来配ffffff时,(\w)配第一个f,(?=\1\1\1)指后面接fff的字符串,但注意这里你前面有括号,没有其它表达式,单(?=\1\1\1)只能匹配后面跟fff的这么一个位置,后面有(\1)可以再匹配一个f;另外( )+是贪婪匹配,最后一个可以匹配到的f是,第3,4个f中间的位置(后面跟fff)再加上第4个f。即是说,(\w)((?=\1\1\1)(\1))+这个表达是可以匹配ffff(前4个f)。具体到$match,这个对应的是第一列,即$match[$i][0],$match[0][0]是能匹配的全部内容,即ffff,$match[1][0]是(\w)这个括号,即第一个f,$match[2][0]是((?=\1\1\1)(\1))这个括号,也是一个f,$match[3][0]是(\1)这个括号(注意,(?= )这个括号是不计算在内的),也是一个f。9999999这个类似。希望能看明白我自己也快糊涂了
      

  4.   

    果然遇到强人了,清晰了很多。
    可是为什么只有两个匹配的呢,光ffffff中就应该有前两个匹配的,999999999中应该有前五个匹配。
      

  5.   

    echo preg_match_all( '/(\w)((?=\1\1\1)(\1))+/' , 'aaa ffffff 999999999',$match ); 
    print_r( $match);\1表示的是与\w一模一样的字符
      

  6.   

    (?=pattern)表示正向预查所以在你的这个'/(\w)((?=\1\1\1)(\1))+/中匹配最少4个相同的连续字符
    所以$match[0]里包含[0] => Array ( [0] => ffff [1] => 9999999 
      

  7.   

    也许这么说你会更理解些f fffff
    9 99999999
    红色表示(\w),蓝色表示(?=\1\1\1)(\1)
    由于你对(?=\1\1\1)(\1)使用了贪婪式匹配,所以这里第一次只匹配了ffff和9 999999得到了这样的字符
      

  8.   

    我还是不明白为什么只匹配了两个,其实就是需要五个连续的字符,ffffff 应该可以有两个匹配的,前五个f和后五个f,
    999999999应该可以有五种匹配。
      

  9.   

    不是说得很明白了吗?
    由于你使用了贪婪式匹配
    所以只匹配了2次第一次是匹配ffff,第二次匹配9999999如果如果不使用贪婪式匹配,那么他匹配的就是第一次是匹配ff第二次匹配ff,第三次匹配99,第四次匹配99,第五次匹配99“ffffff 应该可以有两个匹配的,前五个f和后五个f”
     不可能有你的这说法的
      

  10.   

    如果只是preg_match_all( '/(\w)(\1){4,}/' , 'aaa ffffff 999999999',$match ); 
    就可以匹配到5个以上连续的字符串了为什么非要写那么复杂呢?
      

  11.   


    是这样么?(?=\1\1\1)是零宽的,不匹配任何字符。(\1)只匹配单个字符。这个正则是这样的:首先,(\w)捕获一个字符,并且设置了\1然后后面的(\1)第一次匹配到了第五个f,再次强调(?=\1\1\1)是零宽的
    也就是说第二个第三个第四个f是不会被匹配到的。
      

  12.   

    多谢大家,辛苦了,对正则一直都有些迷糊,这次决定弄明白了。
    还有两个问题:
    1.贪婪匹配的情况下只能匹配两个,我理解了,可是我又发现一个问题,为什么$match[0][0]中是ffff,应该是fffff才对啊,(\w)((?=\1\1\1)(\1))+
    "\w"一个 (?=\1\1\1)三个(\1)一个,为什么最后匹配成了四个呢。2.还有当我把加号去掉了是5个匹配的,“ffffff 应该可以有两个匹配的,前五个f和后五个f”,“chinmo”说不可能有这种情况,那在非贪婪模式下为什么ffffff会被匹配两次呢。
    不过“ffffff 应该可以有两个匹配的,前五个f和后五个f”,如果真是这样,
    $str =    "aaa<vvvB<>cccc</B>ddd<U>eeee</U>ffff";
    echo preg_match_all('/<(.+?)>/' , $str , $match); print_r($match);
    vvvB<中的<应该也被用于匹配,可是事实上没有,他被当作普通字符了,输出的是:
    4Array
    (
        [0] => Array
            (
                [0] => <vvvB<>
                [1] => </B>
                [2] => <U>
                [3] => </U>
            )
     
        [1] => Array
            (
                [0] => vvvB<
                [1] => /B
                [2] => U
                [3] => /U
            )
     
    )
    我彻底糊涂了。