本帖最后由 CunningBoy 于 2010-09-04 10:34:31 编辑

解决方案 »

  1.   


    占位学习一下先贪婪与非贪婪模式各有其应用场景,但都不能用来处理嵌套或配对出现的标记.NET中的平衡组可以解决嵌套标签匹配的问题,记得以前好像在哪见过PHP中说是也有类似语法的,没有PHP环境,没法验证不过针对楼主要求的结果,逐层获取嵌套标签,即使是支持平衡组或类似的语法,也不可能通过一个正则获取到这些结果的,还需要结合循环或者递归来达到这一目的这样的话,正则无论从实现难易程度上,还是执行效率上就都不占优了
    正则由于进行了尽可能的抽象,所以具有高度的灵活性和可扩展性,但是在处理某些特定问题的时候,它又会做许多额外的判断,无形中降低了匹配效率
    其实正则也不过是有穷状态机的一种实现,我们完全可以通过“栈”的方式,自己去写个方法来实现这一需求一家之言,欢迎讨论,PHP的代码我是写不出了,只能进行一下理论上的探讨
      

  2.   


    preg_replace('/(>)([^>|^<\?|^\r\n][^\d]+?)([<|<\/])/i', "$1<?php print_R(\$translate->_(\"$2\")) ?>$3", $data);看一下这个是不是你想要的,我这里不是获取标签里面的内容,而是给标签里面的内容加上一个指定的函数,我试过了,只能匹配80%,要完全匹配还得花点心思
      

  3.   

    上面有一点小问题,再发一个preg_match_all('/([^\?|^>]>){1}([^>|^<\?|^\r\n|^if]+?)([<|<\/][^\?])/U', $string, $arr);
    print_R($arr);
      

  4.   

    我相信这个可以做到或接近做到:
    http://ca.php.net/manual/en/regexp.reference.recursive.php下面的那个注释已经可以匹配对应的,但是似乎只是最外层的
      

  5.   

    JavaScript是用于处理你自己的网页的。
    如果想抓取别人的网页内容,用JavaScript是处理不了的。
      

  6.   

    单纯的使用正则表达式,几乎是不可能完成的。即便是 .NET中的平衡组 也是这样
    即便是能够识别了,也不能很好的解决正文中出现的“<”、“>”。
    比如 xml 解析器就要求强制转义<>
    而专为解析 HTML 而设计的 tidy 依然不能识别正文中的 <字母 组合
      

  7.   

    aaaabbbbccc<a href="aaa.html">aaaaabbbbcccc</a>aaaabbbccc
    要把a标签外面的a元素找出来,该怎么匹配
    preg_match_all("#<a[^>]*>(.*?)<\/a>#",$str2,$arr);这样写只能把a标签找到...