这是要匹配的内容:
<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>s+<dt>(.*?)</dt>(s+<dd>(.*?)</dd>s+)*?</dl>
$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); 写
$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);分开匹配吧,dl 匹配一次,里面的dt和dd再匹配一次。
变通一下(待匹配的项数不定,形式语言基本无法实现)
preg_match_all('#<(d[dt])>s*([^<]+)</\1>#is', $s, $r);print_r($r);这个你要一个正则式没办法实现的,要么就像xuzuning说的那样去做了,只是那样去作无法分清楚哪些是dt的,那些是dd的
因为相同分组会自动覆盖,要么想版主全匹配要么就是分开2次匹配。
变通一下(待匹配的项数不定,形式语言基本无法实现)
preg_match_all('#<(d[dt])>s*([^<]+)</\1>#is', $s, $r);print_r($r);<(d[dt])>s*([^<]+)</\1>
s*([^
这就是向后引用
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号