我想捕获一个字符串中<div></div>里的内容,用了这样一个正则式:<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div> 这个正则式我用工具测试过了,没有问题。但是当我放到php程序里面后:
$reg = "<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>";
preg_match_all($reg,$data,$result);就报错了:Unknown modifier ']' 
请问这是什么原因?

解决方案 »

  1.   

    字符串前后加上/^ $/后 报错 :  Unknown modifier 'd' 
      

  2.   

    把/都改成\/后 ,仍报错:Unknown modifier ']'
      

  3.   

    $reg = "/<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>/i";
      

  4.   

    改成
    /<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'<\/div>)[^<>]*)+)*(?(Open)(?!))<\/div>/i
    这样后仍然报错:Compilation failed: syntax error in subpattern name (missing terminator)
      

  5.   

    /<div[^>]*>[^<>]*(((\?\'Open\'<div[^>]*>)[^<>]*)+((\?\'-Open\'<\/div>)[^<>]*)+)*(\?(Open)(\?\!))<\/div>/读出来一堆空数组
      

  6.   

    php正则引擎好像暂时不支持平衡组
    有意思的请参考:php正则取嵌套html标签(http://blog.csdn.net/iseagold/archive/2010/04/14/5484904.aspx)
      

  7.   

    sorry, 我也是才知道平衡组
      

  8.   

    我想根据id或者name 匹配任意的html标签,包括标签内的所有内容,包括成对的或者不成对出现的标签
      

  9.   

    <div class="a"><h1 class="hello">hello</h1><a id="index" href="index.php"><img class="img" src="1.jpg" /></a></div><div id="test"><span class="title"><strong>Strong Text</strong></span></div>从这段代码内,将
    <div class="content"><h1 class="hello">hello</h1><a id="index" href="index.php"><img class="img" src="1.jpg" /></a></div><div id="test"><span class="title"><strong>Strong Text</strong></span></div><a id="index" href="index.php"><img class="img" src="1.jpg" /></a><span class="title"><strong>Strong Text</strong></span> 将id或者class的值看做一个变量,任意匹配符合正则式的那一组标签的内容,也就是说,以上3段代码符合的正则式,除了class="content",id="index",class="title"以外,其余的部分都是相同的,这三个不同的地方在php程序中传入相应变量即可。多谢!
      

  10.   

    我写了一个这样的正则式:
    /<\s*[a-z][0-z]*[^>]*[^\/]>(([^<>]*)|(<\s*[a-z][0-z]*[^>]*\/>)|(?R))*<\/[a-z][0-z]*>/但是第一个标签总是匹配不到比如:<div class="test1">
    <div class="test2">
    <span>alk</span>
    <img src="d.jpg"/>
    <div class="test3">
    <strong>dkk<br/></strong>
    </div>
    <a href="lk.php">
    <h1>dklk</h1>
    </a>
    </div>
    <div class="c">lkj</div>
    </div>
    匹配的结果是:
    array(1) {
        [0]=>
        string(173) "<div class="test2"><span>alk</span><img src="d.jpg"/><div class="test3"><strong>dkk<br/></strong></div><a href="lk.php"><h1>dklk</h1></a></div><div class="c">lkj</div></div>"
      }
      

  11.   

    第一个<div>标签丢了,但是和它匹配的</div>却读出出来了
      

  12.   

    $s = <<<html
    <div class="a">
    <h1 class="hello">hello</h1>
    <a id="index" href="index.php">
    <img class="img" src="1.jpg" />
    </a>
    </div>
    <div id="test">
    <span class="title">
    <strong>Strong Text</strong>
    </span>
    </div>
    html;
    $pattern = "/(".
    "<\!\w+(?:\s+[^>]*?)+\s*>|".
    "<\w+(?:\s+\w+(?:\s*=\s*(?:\"[^\"]*\"|'[^']*'|[^\"'>\s]+))?)*\s*\/?>|".
    "<\/\w+\s*>|".
    "<\!--[^-]*-->".
    ")/";preg_match_all($pattern, $s, $aMatches, PREG_OFFSET_CAPTURE);
    function getMatchTags($s, $arr) {
            
        $sMatchClose = '';
        $arrClose = array();
        $arrReturn = array();
        for($i=0; $i<count($arr); $i++) {
            
            $iCount = 0;
            if (preg_match("/<[^>\s*]*/", $arr[$i][0], $aMatchOpen)) {
            
                $sMatchClose = '</' . substr($aMatchOpen[0], 1) . '>';    
                for($j=$i; $j<count($arr); $j++) {
                    if (!(stripos($arr[$j][0], $aMatchOpen[0]) === false)) {                    $iCount ++;
                        $flag = 1;
                    }
                    if (!(stripos($arr[$j][0], $sMatchClose) === false)) {                    $iCount --;
                        $flag = 1;
                        if($iCount == 0 && $flag == 1) {
                            $arrClose[] = $arr[$i];
                            $arrClose[] = $arr[$j];    
                        }
                    }
                }
            }
        }
        $k=0;
        for($i=0; $i<count($arrClose); $i+=2) {
            
            $arrReturn[$k][0] = $arrClose[$i];    
            $arrReturn[$k][1] = $arrClose[$i+1];    
            $arrReturn[$k][2] = substr($s, $arrClose[$i][1], $arrClose[$i+1][1]+strlen($arrClose[$i+1][0])-$arrClose[$i][1]);    
            $k++;
        }
        return $arrReturn;
    }
    print_r(getMatchTags($s, $aMatches[0]));
      

  13.   

    不如用 dom + xpath 了