preg_match_all("'<\s*a\s.*?href\s*=\s*([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))'isx",$document,$links);
我知道是用来批评链接的,但是怎么理解啊?哪位给讲讲?
小弟先行谢过了!

解决方案 »

  1.   

    preg_match_all("' <\s*a\s.*?href\s*=\s*([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))'isx",$document,$links); 
    这个写得有点问题,首先a肯定是挨着<的,<a 其实你看一下正则,这个不难懂的。
      

  2.   

    ?(?(l)(.*?)\\1|([^\s\>]+))'isx
    这里往后就看不懂了
      

  3.   

    不一定啊 
    < a href= abc.html>abc</a>我也可以这么写啊
      

  4.   

    这是 php-snoopy那个类里面的一行,怎么可能不行!
      

  5.   

    (?(存在某个捕获组)正则式1|正则式2) : 意思是存在某个捕获组,就用正则式1,否则用正则式2([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))
    意思就是如果捕获到单引号或者双引号,就用匹配式(.*?)\\1,否则用匹配式([^\s\>]+).
    因为([\"\'])用括号括起来了,所以一旦捕获,就是捕获组1,你可以\\1这样去后向引用它,(?(1)..|..)中的?(1)就是判断是否匹配到了双引号或者单引号,意思相当于程序语言中的if(isExist(\\1))。
      

  6.   

    简化下例子,可以帮助理解。
    //只匹配href='任意字符'(单引号) 和 href=数字
    $str = "href='123' href='abc' href=456 href=\"abc\" href=cde";
    preg_match_all("/href=(\')?(?(1)(.*?)\\1|([0-9]+))/is",$str,$links);
      

  7.   

    ' <\s*a\s.*?href\s*=\s*([\"\'])?(?(l)(.*?)\\1|([^\s\>]+))'isx
    那我简单的说一下哪,照我的理解,首先后面的i是不分大小写,sx我就不知道了,你自己找找吧,
    < 零个或者一个空格 a 一个空格 任意个字符 href 0或者N个空格 = 0或者N个空格 '或者" 零个或者一个 
    任意字符 或者 '或者" 或者匹配 N个空格 结束符            大致就这些了,这个也挺不好讲的,一般只是个人意会。
      

  8.   

    这下全明白了,多谢了!
    还有我想取得<a href=abc.html>abc</a>
    这样的结果:abc.html=>abc 就是链接和锚文本都取出来,该怎么办呢?
      

  9.   

    8楼高手也,想不到正则也可以讲得这么清楚,自叹不如啊! 如果你想取,你只需要把href=abc.html取出来,然后用=分开就可以了。用把这些放在()里面可以捕获到.
      

  10.   

    try
    preg_match_all("'<\s*a\s.*?href\s*=\s*([\"\'])?(?(1)(.*?)\\1|([^\s\>]+))[^>]*?>(.*?)</a>'isx"
    ,"<a href='123456'>aaa</a><a href='234567'>bbb</a><a href=111111>ccc</a>"
    ,$links); 
    print_r($links);
      

  11.   

    实现啦!简直太佩服了,正则都可以解释的这么清楚!再次感谢!
    我是个刚学PHP不到一年的小鸟,看了还有很多要学的啊
      

  12.   

    呵呵,最好多多测试,匹配html一旦忽略了某个因素,就很可能匹配不到。
      

  13.   

    问题又出现了,招这个写法,如果我匹配这段的话:
    <a href= 1111.html target=_blank>111</a>
    <a href=' 2222.html' target=_blank>222</a>
    <a href=" 3333.html" target=_blank>333</a>
    <a href=444.html>444</a>
    <a href="555.html" >555</a>
    < a href=666.html >666</a>
    就会得到这样的结果:
    2222.html==》111
    3333.html==》222
    555.html==》333
    1111.html==》444
    444.html==》555
    666.html==》666
    不是对应的,怎么处理呢?