嵌套正则表达式的结果
Nesting the result of regular expression
我正在像这样解析一些 HTML
<h3>Movie1</h3>
<div class="time"><span>10:00</span><span>12:00</span></div>
<h3>Movie2</h3>
<div class="time"><span>13:00</span><span>15:00</span><span>18:00</span></div>
我希望结果数组看起来像这样
0 =>
0 => Movie1
1 => Movie2
1 =>
0 =>
0 => 10:00
1 => 12:00
1 =>
0 => 13:00
1 => 15:00
2 => 18:00
我可以分两步完成
1) 通过正则表达式获取电影名称和整部电影的时间表
~<h3>(.*?)</h3>(?:.*?)<div class="time">(.*?)</div>~s
2) 像这样通过正则表达式获取时间(我在第 1 步获得的每部电影的循环中都这样做)
~<span>([0-9]{2}:[0-9]{2})</span>~s
而且效果很好。
问题是:是否有一个正则表达式只需要一步就可以得到相同的结果?
我试过这样的嵌套组
~<h3>(.*?)</h3>(?:.*?)<div class="time">((<span>(.*?)</span>)*)</div>~s
而且我只得到每部电影的最后一次(只有 12:00 和 18:00)。
使用 DOMDocument:
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodeList = $xpath->query('//h3|//div[@class="time"]/span');
$result = array();
$currentMovie = -1;
foreach ($nodeList as $node) {
if ($node->nodeName === 'h3') {
$result[0][++$currentMovie] = $node->nodeValue;
continue;
}
$result[1][$currentMovie][] = $node->nodeValue;
}
print_r($result);
注意:为了更严谨,可以将xpath查询改成:
//h3[following-sibling::div[@class="time"]] | //div[@class="time"]/span
我正在像这样解析一些 HTML
<h3>Movie1</h3>
<div class="time"><span>10:00</span><span>12:00</span></div>
<h3>Movie2</h3>
<div class="time"><span>13:00</span><span>15:00</span><span>18:00</span></div>
我希望结果数组看起来像这样
0 =>
0 => Movie1
1 => Movie2
1 =>
0 =>
0 => 10:00
1 => 12:00
1 =>
0 => 13:00
1 => 15:00
2 => 18:00
我可以分两步完成
1) 通过正则表达式获取电影名称和整部电影的时间表
~<h3>(.*?)</h3>(?:.*?)<div class="time">(.*?)</div>~s
2) 像这样通过正则表达式获取时间(我在第 1 步获得的每部电影的循环中都这样做)
~<span>([0-9]{2}:[0-9]{2})</span>~s
而且效果很好。 问题是:是否有一个正则表达式只需要一步就可以得到相同的结果?
我试过这样的嵌套组
~<h3>(.*?)</h3>(?:.*?)<div class="time">((<span>(.*?)</span>)*)</div>~s
而且我只得到每部电影的最后一次(只有 12:00 和 18:00)。
使用 DOMDocument:
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodeList = $xpath->query('//h3|//div[@class="time"]/span');
$result = array();
$currentMovie = -1;
foreach ($nodeList as $node) {
if ($node->nodeName === 'h3') {
$result[0][++$currentMovie] = $node->nodeValue;
continue;
}
$result[1][$currentMovie][] = $node->nodeValue;
}
print_r($result);
注意:为了更严谨,可以将xpath查询改成:
//h3[following-sibling::div[@class="time"]] | //div[@class="time"]/span