谁帮改个正则?
时间:2021-07-01 10:21:17
帮助过:11人阅读
这是要匹配的内容:
- 2013
- row1
- row2
- row3
- 2014
- row1
- row2
要匹配dl,并且匹配dl下的dt,和所有的dd,
我是这样写的:
\s+- (.*?)
(\s+- (.*?)
\s+)*?
但是这个匹配出的结果不太对,dd始终只匹配到了最后一个。这个表达式应该怎么修改呢?
回复讨论(解决方案)
$s =<<< HTML
- 2013
- row1
- row2
- row3
- 2014
- row1
- row2
HTML;preg_match_all('#
.+
#isU', $s, $r);print_r($r);Array
(
[0] => Array
(
[0] =>
- 2013
- row1
- row2
- row3
[1] =>
- 2014
- row1
- row2
)
)
写
$s =<<< HTML
- 2013
- row1
- row2
- row3
- 2014
- row1
- row2
HTML;preg_match_all('#
.+
#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>不是太懂哦,谢谢
< (d[dt])>\s*([^<]+) \\1>
这就是向后引用