$str = <<<EOT
   
aaaa
<div>xxx</div>
<div id='my'>
   <div>aaa</div>sssss
    <div>bbbb</div>xee    
</div>
aaa
<div>111s</div>sss
EOT;$reg = "/<div id='my'>[\s\S]*?(((?'open'<div[^>]*>)[\s\S]*?)+((?'-open'<\/div>)[\s\S]*?)+)*(?(open)(?!))<\/div>/";
preg_match($reg,$str,$rtn);
            
var_dump($rtn);用RegEx TestBed 测试可以的,但php却不行,
提示
Warning: preg_match(): Compilation failed: syntax error in subpattern name (missing terminator) at offset 56 in E:\website\test\regular.php on line 23
NULL
是什么原因啊??然道php不支持平衡组, 请教

解决方案 »

  1.   

    不知是否是你要的结果$str = <<<EOT
        
    aaaa
    <div>xxx</div>
    <div id='my'>
       <div>aaa</div>sssss
        <div>bbbb</div>xee    
    </div>
    aaa
    <div>111s</div>sss
    EOT;
     
    $reg = "/<div id='my'>[\s\S]*?(((?'open'<div[^>]*>)[\s\S]*?)+((?'_open'<\/div>)[\s\S]*?)+)*(?(open)(?!))<\/div>/s";
    preg_match_all($reg,$str,$rtn);
                 
    print_r($rtn);Array
    (
        [0] => Array
            (
                [0] => <div id='my'>
       <div>aaa</div>
            )    [1] => Array
            (
                [0] => 
            )    [2] => Array
            (
                [0] => 
            )    [open] => Array
            (
                [0] => 
            )    [3] => Array
            (
                [0] => 
            )    [4] => Array
            (
                [0] => 
            )    [_open] => Array
            (
                [0] => 
            )    [5] => Array
            (
                [0] => 
            ))
      

  2.   

    其实我想取以这个开始<div id='my'>  并且以匹配div结束之间的内容也就是示例中的
    <div>aaa</div>sssss
        <div>bbbb</div>xee  
      

  3.   

    当然,<div id='my'>后面的内容是不确定的,
      

  4.   

    其实我并不明白你的规则串的含义
    因为报错,所以将 -open 改成了 _open这样是否好点$s =<<< TXT
        
    aaaa
    <div>xxx</div>
    <div id='my'>
       <div>aaa</div>sssss
        <div>bbbb</div>xee    
    </div>
    aaa
    <div>111s</div>sss
    TXT;
    $p = "/<([a-z]+)[^>]*>([^<>]|(?R))*<\/\\1>/is";preg_match_all($p,$s,$m);print_r($m[0]);Array
    (
        [0] => <div>xxx</div>
        [1] => <div id='my'>
       <div>aaa</div>sssss
        <div>bbbb</div>xee    
    </div>
        [2] => <div>111s</div>
    )再幻化一下?
      

  5.   

    其实有一个网站,它的文章页面中,文章内容放在 <div id='my'> 与 </div>之间我想把这个网站的所有文章内容采集下来,也就是取 <div id='my'> 与 </div>之间的内容
      

  6.   

    也就是取配对的 <div id='my'> 与 </div> 之间的内容
      

  7.   


    $str = <<<EOT
         
    aaaa
    <div>xxx</div>
    <div id='my'>
       <div>aaa</div>sssss
        <div>bbbb</div>xee    
    </div>
    aaa
    <div>111s</div>sss
    EOT;
      
    $reg = "/<div id='my'>[\s\S]*?<\/div>/s";
    preg_match_all($reg,$str,$rtn);
                  
    print_r($rtn);
      

  8.   

    楼主解决问题没?我也遇到同样问题,好像php确实不支持平衡组。