如何在span节点之间获取所有文本节点值

时间:2013-02-09 06:58:38

标签: php dom xpath

我有以下html结构

<span class="x">a</span>
<br>
• first
<br>
• Second
<br>
• second
<br>
• third
<br>
<br>
<span class="x">b</span>

我需要获得跨度节点之间出现的所有文本值(以逗号分隔),即第一,第二,第二,第三

如何使用xpath,dom

完成此操作

2 个答案:

答案 0 :(得分:3)

您可以使用XPath查询这些元素,但需要在PHP中“清理”这些项目符号,因为SimpleXML仅支持XPath 1.0而没有扩展的字符串编辑功能。

最重要的是XPath表达式,我将详细解释:

  • //span[text()='a']/following::text():在内容为“a”的范围内获取所有文本节点
  • [. = //span[text()='b']/preceding::text()]内容为“b”
  • 的范围之前,将它们中的每一个与文本节点集进行比较

这是完整的代码,您可能需要投入更多精力来消除要点。确保PHP将其评估为UTF-8,否则您将获得Mojibake而不是项目符号。

<?php
  $html = '
<span class="x">a</span>
<br>
• first
<br>
• Second
<br>
• second
<br>
• third
<br>
<br>
<span class="x">b</span></wrap>
';

  libxml_use_internal_errors(true);
  $dom = new DOMDocument();
  $dom->preserveWhiteSpace = false;
  $dom->strictErrorChecking = false;
  $dom->recover = true;
  $dom->loadHTML($html);

  $xpath = new DOMXPath($dom);
  $results = $xpath->query("//span[text()='a']/following::text()[. = //span[text()='b']/preceding::text()]");

  foreach ($results as $result) {
    $token = trim(str_replace('•', '', $result->nodeValue));
    if ($token) $tokens[] = $token;
  }

  echo implode(',', $tokens);
?>

答案 1 :(得分:1)

您的html结构<br>后跟项目符号点可轻松转换为无序列表<ul></ul>,而无需更改页面布局。

然后,您可以选择所有列表项<li></li>的文本,并使用逗号分隔它们。我已经添加了一个示例in this jsFiddle

要获得此文本,您可以使用:

var nodes = $('ul > li').map(function() {
return $(this).text();
}).toArray().join(",");

其中nodes是字符串'first,Second,second,third'