【问题标题】:XPath (PHP Dom) - How to find span with attribute and retrieve previous siblingsXPath (PHP Dom) - 如何使用属性查找 span 并检索以前的兄弟姐妹
【发布时间】: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>

如何提取具有特定值的&lt;span&gt; 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() &amp;lt; 5]"

标签: php html dom xpath


【解决方案1】:
//span[@m=12950] | //span[@m=12950]/preceding-sibling::span[position() < 6]

//span[@m=12950] - 拿走你的物品

//span[@m=12950]/preceding-sibling::span - 添加以前的跨度

[position()

【讨论】:

  • @Cylian 的原因,这只是一个来自正则表达式的愚蠢习惯 :)
  • 太好了,谢谢。如何将所选元素添加到新文档?我的目标是将前 5 个跨度加上匹配的跨度加上接下来的 5 个跨度作为字符串输出。
  • 你要生成xml还是字符串结果?第二种情况是什么格式?
  • 我正在寻找输出 HTML 字符串(我正在传递给客户端以在网页上显示)。对于 m7700 我需要以下内容:&lt;span m='2330'&gt;October&lt;/span&gt; &lt;span m='2940'&gt;31,&lt;/span&gt; &lt;span m='3940'&gt;2008.&lt;/span&gt; &lt;span m='5750'&gt;I'm&lt;/span&gt; &lt;span m='6010'&gt;Interviewing&lt;/span&gt; &lt;span m='7700'&gt;for&lt;/span&gt; &lt;span m='7920'&gt;the&lt;/span&gt; &lt;span m='8050'&gt;organisation's&lt;/span&gt; &lt;span m='9360'&gt;sesquicentennial&lt;/span&gt; &lt;span m='10410'&gt;Oral&lt;/span&gt; &lt;span m='10690'&gt;History&lt;/span&gt;
  • 我已经用目前的代码更新了问题,但我收到了一个错误DOMException: Wrong Document Error in DOMNode-&gt;appendChild()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
相关资源
最近更新 更多