【发布时间】:2016-12-27 14:41:32
【问题描述】:
鉴于以下 HTML 文档摘录:
<p>
<span m='1900'>INTERVIEWER: Today</span>
<span m='2180'>is</span>
<span m='2330'>October</span>
<span m='2940'>31,</span>
<span m='3940'>2008.</span>
<span m='5750'>I'm</span>
<span m='6010'>Interviewing</span>
<span m='7700'>for</span>
<span m='7920'>the</span>
<span m='8050'>organisation's</span>
<span m='9360'>sesquicentennial</span>
<span m='10410'>Oral</span>
<span m='10690'>History</span>
<span m='11170'>project,</span>
<span m='12380'>talking</span>
<span m='12760'>about</span>
<span m='12950'>how</span>
<span m='13470'>things</span>
</p>
如何提取具有特定值的<span> m 属性以及之前的 5 个兄弟?
到目前为止,我有以下代码,可以正确识别跨度:
$xpath_query = "//span[@m='" . $timestamp . "']";
$span = $xpath->query($xpath_query);
如何找回之前的兄弟姐妹?
编辑:
我的最终目标是创建一个 HTML 字符串,其中包含匹配项以及前 5 个兄弟姐妹和接下来的 5 个兄弟姐妹。这是我到目前为止的代码:
$output_doc = new DOMDocument;
$xpath_query = "//span[@m='" . $timestamp . "']/preceding-sibling::span[position() < 5]";
$previous_spans = $xpath->query($xpath_query);
foreach($previous_spans as $previous_span) {
$output_doc->appendChild($previous_span);
}
$xpath_query = "//span[@m='" . $timestamp . "']";
$span = $xpath->query($xpath_query);
$output_doc->appendChild($span);
$xpath_query = "//span[@m='" . $timestamp . "']/following-sibling::span[position() < 5]";
$next_spans = $xpath->query($xpath_query);
foreach($next_spans as $next_span) {
$output_doc->appendChild($next_span);
}
编辑 2: 这是我最后用来让它工作的代码:
function get_snippets($transcript, $timestamps) {
$doc = new DOMDocument;
$doc->loadHTML($transcript);
$output = array();
$xpath = new DOMXPath($doc);
foreach($timestamps as $timestamp) {
$xpath_query = "//span[@m='" . $timestamp . "']/preceding-sibling::span[position() < 10]";
$previous_spans = $xpath->query($xpath_query);
foreach($previous_spans as $previous_span) {
$output[$timestamp] = $output[$timestamp] . ih_video_outer_html($previous_span);
}
$xpath_query = "//span[@m='" . $timestamp . "']";
$span = $xpath->query($xpath_query);
foreach($span as $match) {
$output[$timestamp] = $output[$timestamp] . ih_video_outer_html($match);
}
$xpath_query = "//span[@m='" . $timestamp . "']/following-sibling::span[position() < 10]";
$next_spans = $xpath->query($xpath_query);
foreach($next_spans as $next_span) {
$output[$timestamp] = $output[$timestamp] . ih_video_outer_html($next_span);
}
}
}
function ih_video_outer_html($e) {
$doc = new DOMDocument();
$doc->appendChild($doc->importNode($e, true));
return $doc->saveHTML();
}
【问题讨论】:
-
只需将
preceding-sibling::span添加到您现有的查询构造中...使其类似于"//span[@m='" . $timestamp . "']/preceding-sibling::span"... -
不错!这会给我所有以前的兄弟姐妹吗?然后我可以循环选择最后 5 个?
-
"//span[@m='" . $timestamp . "']/preceding-sibling::span[position() &lt; 5]"