首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

哪位高手帮改个正则

2013-08-01 
谁帮改个正则?这是要匹配的内容: dldt2013/dtddrow1/ddddrow2/ddddrow3/dd/dldldt

谁帮改个正则?
这是要匹配的内容:

 


<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始终只匹配到了最后一个。这个表达式应该怎么修改呢? 正则
[解决办法]
分开匹配吧,dl 匹配一次,里面的dt和dd再匹配一次。
[解决办法]
变通一下(待匹配的项数不定,形式语言基本无法实现)
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
        )

)

[解决办法]
这个你要一个正则式没办法实现的,要么就像xuzuning说的那样去做了,只是那样去作无法分清楚哪些是dt的,那些是dd的
[解决办法]
因为相同分组会自动覆盖,要么想版主全匹配要么就是分开2次匹配。

热点排行