Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何获取跨节点之间的所有文本节点值_Php_Dom_Xpath - Fatal编程技术网

Php 如何获取跨节点之间的所有文本节点值

Php 如何获取跨节点之间的所有文本节点值,php,dom,xpath,Php,Dom,Xpath,我有以下html结构 <span class="x">a</span> <br> • first <br> • Second <br> • second <br> • third <br> <br> <span class="x">b</span> a •首先 •第二 •第二 •第三 B 我需要获取跨节点之间出现的所有文本值(逗号分隔),即第一个、第二个、第二个

我有以下html结构

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

•首先
•第二
•第二
•第三

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


如何使用xpath、dom实现这一点无需更改页面布局,您的

html结构和要点就可以轻松地转换为无序列表

    然后,您可以选择所有列表项的文本,并用逗号分隔它们。我举了一个例子

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

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

    其中,
    节点
    是字符串
    'first,Second,Second,third'
    您的

    的html结构后跟项目符号,无需更改页面布局即可轻松转换为无序列表

    然后,您可以选择所有列表项的文本,并用逗号分隔它们。我举了一个例子

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

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

    其中
    节点
    是字符串
    'first,Second,Second,third'

    您可以使用XPath查询这些元素,但需要在PHP中对这些要点进行“清理”,因为SimpleXML只支持XPath 1.0而不支持扩展的字符串编辑功能

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

    • //span[text()='a']/following::text()
      :获取span之后包含内容“a”的所有文本节点
    • [.=//span[text()='b']/previous::text()]
      将它们中的每一个与内容为“b”的span之前的文本节点集进行比较
    这是完整的代码,您可能需要投入更多的精力来删除要点。确保PHP将其评估为UTF-8,否则您将得到的不是要点

    <?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);
    ?>
    

    您可以使用XPath查询这些元素,但需要在PHP中对这些要点进行“清理”,因为SimpleXML只支持XPath 1.0,没有扩展的字符串编辑功能

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

    • //span[text()='a']/following::text()
      :获取span之后包含内容“a”的所有文本节点
    • [.=//span[text()='b']/previous::text()]
      将它们中的每一个与内容为“b”的span之前的文本节点集进行比较
    这是完整的代码,您可能需要投入更多的精力来删除要点。确保PHP将其评估为UTF-8,否则您将得到的不是要点

    <?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);
    ?>
    

    检查此问题:,只需使用“span”而不是checkboxPHP中的解决方案会更好:)您的意思是您正在用php获取此内容,并希望检索php文件中的文本以及这些
    标记?检查此问题:,您只需要使用“span”而不是checkboxPHP中的解决方案会更好:)您的意思是您正在用php获取此内容,并希望检索php文件中的文本以及那些
    标记?