谁帮改个正则?

php中文网
发布: 2016-06-23 14:16:44
原创
1165人浏览过

这是要匹配的内容:

 

<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始终只匹配到了最后一个。这个表达式应该怎么修改呢?


回复讨论(解决方案)

$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] => 


    
2013

    
row1

    
row2

    
row3


            [1] => 

    
2014

    
row1

    
row2


        )

)



$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] => 


    
2013

    
row1

    
row2

    
row3


            [1] => 

    
2014

    
row1

    
row2


        )

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

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

变通一下(待匹配的项数不定,形式语言基本无法实现)

preg_match_all('#<(d[dt])>s*([^<]+)</\1>#is', $s, $r);print_r($r);
登录后复制
Array
(
    [0] => Array
        (
            [0] => 

2013

            [1] => 
row1

            [2] => 
row2

            [3] => 
row3

            [4] => 
2014

            [5] => 
row1

            [6] => 
row2

        )

    [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次匹配。

变通一下(待匹配的项数不定,形式语言基本无法实现)

preg_match_all('#<(d[dt])>s*([^<]+)</\1>#is', $s, $r);print_r($r);
登录后复制
Array
(
    [0] => Array
        (
            [0] => 

2013

            [1] => 
row1

            [2] => 
row2

            [3] => 
row3

            [4] => 
2014

            [5] => 
row1

            [6] => 
row2

        )

    [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
        )

)

谢谢版主啦。解决问题了,不过改用的是dom,

不过请版主解释一下你那个表达式呗

<(d[dt])>s*([^<]+)</\1>
登录后复制


这个\1>不是太懂哦,谢谢

s*([^
这就是向后引用

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号