0

I have following html structure

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

I need to get all the text value(comma separated) that occur between span nodes i.e first,second,second,third

How can this be done using xpath,dom

4

2 回答 2

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);
?>
于 2013-02-09T09:09:43.207 回答
1

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

然后您可以选择所有列表项的文本<li></li>并用逗号分隔它们。我在这个 jsFiddle 中包含了一个示例。

要获取此文本,您可以使用以下命令:

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

nodes字符串在哪里'first,Second,second,third'

于 2013-02-09T08:03:11.547 回答