本帖最后由 edisonli 于 2012-10-16 12:56:30 编辑

解决方案 »

  1.   

    $string = 'some text <tag:cate name="a"><div>a</div><tag:cate name="b"><div></div></tag:cate><tag:cate>c</tag:cate></tag:cate>d<tag:cate>e</tag:cate> more text';
    preg_match_all("/<tag:cate(.*?)>(?>(?:<\/?\w+>)|\w+|(?R))*<\/tag:cate>/",$string,$matches);
    print_r($matches);Array
    (
        [0] => Array
            (
                [0] => <tag:cate name="a"><div>a</div><tag:cate name="b"><div></div></tag:cate><tag:cate>c</tag:cate></tag:cate>
                [1] => <tag:cate>e</tag:cate>
            )    [1] => Array
            (
                [0] =>  name="a"
                [1] => 
            ))
    这是你要的效果吗?
      

  2.   

    $string = 'some text <tag:cate name="a">
            <div>a</div>
            <tag:cate name="b">
                <div></div>
            </tag:cate>
            <tag:cate>
            c</tag:cate>
        </tag:cate>
        <div>ddd
        </div>
        <tag:cate>
        e</tag:cate> more text';
    这种字符串中间有换行等特殊符号就匹配不了了
      

  3.   

    那就先替换一下><间的所有回车符号。顺便把空格过滤一下。
      

  4.   

    有个多行修饰符,好像是m还是什么来着。
    php.net的pcre部分有写