这是要匹配的内容: 
<dl>
<dt>2013</dt>
<dd>row1</dd>
<dd>row2</dd>
<dd>row3</dd>
</dl>
<dl>
<dt>2014</dt>
<dd>row1</dd>
<dd>row2</dd>
</dl>
要匹配dl,并且匹配dl下的dt,和所有的dd,我是这样写的:<dl>\s+<dt>(.*?)</dt>(\s+<dd>(.*?)</dd>\s+)*?</dl>但是这个匹配出的结果不太对,dd始终只匹配到了最后一个。这个表达式应该怎么修改呢?正则

解决方案 »

  1.   

    $s =<<< HTML
    <dl>
        <dt>2013</dt>
        <dd>row1</dd>
        <dd>row2</dd>
        <dd>row3</dd>
    </dl>
    <dl>
        <dt>2014</dt>
        <dd>row1</dd>
        <dd>row2</dd>
    </dl>
    HTML;
    preg_match_all('#<dl>.+</dl>#isU', $s, $r);
    print_r($r);Array
    (
        [0] => Array
            (
                [0] => <dl>
        <dt>2013</dt>
        <dd>row1</dd>
        <dd>row2</dd>
        <dd>row3</dd>
    </dl>
                [1] => <dl>
        <dt>2014</dt>
        <dd>row1</dd>
        <dd>row2</dd>
    </dl>
            ))
      

  2.   

    写谢谢版主。不过这样的我可以写出来,我还需要匹配dt,和dd,dt和dd里面的东西需要匹配出来
      

  3.   

    分开匹配吧,dl 匹配一次,里面的dt和dd再匹配一次。
      

  4.   

    变通一下(待匹配的项数不定,形式语言基本无法实现)preg_match_all('#<(d[dt])>\s*([^<]+)</\\1>#is', $s, $r);
    print_r($r);Array
    (
        [0] => Array
            (
                [0] => <dt>2013</dt>
                [1] => <dd>row1</dd>
                [2] => <dd>row2</dd>
                [3] => <dd>row3</dd>
                [4] => <dt>2014</dt>
                [5] => <dd>row1</dd>
                [6] => <dd>row2</dd>
            )    [1] => Array
            (
                [0] => dt
                [1] => dd
                [2] => dd
                [3] => dd
                [4] => dt
                [5] => dd
                [6] => dd
            )    [2] => Array
            (
                [0] => 2013
                [1] => row1
                [2] => row2
                [3] => row3
                [4] => 2014
                [5] => row1
                [6] => row2
            ))
      

  5.   

    这个你要一个正则式没办法实现的,要么就像xuzuning说的那样去做了,只是那样去作无法分清楚哪些是dt的,那些是dd的
      

  6.   


    谢谢版主啦。解决问题了,不过改用的是dom,不过请版主解释一下你那个表达式呗
    <(d[dt])>\s*([^<]+)</\\1>
    这个</\\1>不是太懂哦,谢谢
      

  7.   

    <(d[dt])>\s*([^<]+)</\\1>
    这就是向后引用