これは照合する内容です:
<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] => 5c69336ffbc20d23018e48b396cdd57a
73de882deff7a050a357292d0a1fca942013c72c1af5e0e7f90179c047c5ef85885e
358fecab4dc07f1ba949812b65a047ab
73de882deff7a050a357292d0a1fca94/d t>
$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] => 配列
( 67bc4f89d416b0b8236eaa5f43dee742row2) dd>
67bc4f89d416b0b8236eaa5f43dee742行3152436f649dfcc2350c70c7083a3231e
cd324b2387ec29e44e8e788c60648872
73de882deff7a050a357292d0a1fca94c72c1af5e0e7f90179c047c5ef85885e
cd324b2387ec29e44e8e788c60648872
)
)
モデレーターありがとうございます。ただし、dt と dd も一致させる必要があります。
dl を一度一致させ、dt と dd を再度一致させます。
变通一下(待匹配的项数不定,形式语言基本无法实现)
preg_match_all('#<(d[dt])>\s*([^<]+)</\\1>#is', $s, $r);print_r($r);
Array
(
[0] => Array
(
[0] => 73de882deff7a050a357292d0a1fca942013c72c1af5e0e7f90179c047c5ef85885e
[1] => 67bc4f89d416b0b8236eaa5f43dee742row182e295699cff932a4d4dabba39074c35
[2] => 67bc4f89d416b0b8236eaa5f43dee742row282e295699cff932a4d4dabba39074c35
[3] => 67bc4f89d416b0b8236eaa5f43dee742row382e295699cff932a4d4dabba39074c35
[4] => 73de882deff7a050a357292d0a1fca942014c72c1af5e0e7f90179c047c5ef85885e
[5] => 67bc4f89d416b0b8236eaa5f43dee742row182e295699cff932a4d4dabba39074c35
[6] => 67bc4f89d416b0b8236eaa5f43dee742row282e295699cff932a4d4dabba39074c35
)
[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] => 73de882deff7a050a357292d0a1fca942013c72c1af5e0e7f90179c047c5ef85885e
[1] => 67bc4f89d416b0b8236eaa5f43dee742row182e295699cff932a4d4dabba39074c35
[2] => 67bc4f89d416b0b8236eaa5f43dee742row282e295699cff932a4d4dabba39074c35
[3] => 67bc4f89d416b0b8236eaa5f43dee742row382e295699cff932a4d4dabba39074c35
[4] => 73de882deff7a050a357292d0a1fca942014c72c1af5e0e7f90179c047c5ef85885e
[5] => 67bc4f89d416b0b8236eaa5f43dee742row182e295699cff932a4d4dabba39074c35
[6] => 67bc4f89d416b0b8236eaa5f43dee742row282e295699cff932a4d4dabba39074c35
)
[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>
这个d50a5a7cd9932539805dfc6bb0ca7b68不是太懂哦,谢谢
c602d5c4a835356df356439666ddd1a5\s*([^10c68f88a0e833996f301e4495ed8a97
这就是向后引用