【问题标题】:How to properly get all html elements inside a table using regex in php?如何在 php 中使用正则表达式正确获取表中的所有 html 元素?
【发布时间】:2018-08-31 08:45:38
【问题描述】:

所以我正在使用 regex101.com 来测试我的字符串,但我无法获得所需的输出。我制作的样品可以在这里查看https://regex101.com/r/YQTW4c/2

所以我的正则表达式是这样的:

<table class=\"datatable\s\">(.*?)<\/table>

和示例字符串:

<table class="datatable"><thead><tr><tr></thead></table>

我想获取表类数据表中的所有内容,在本例中为&lt;thead&gt;&lt;tr&gt;&lt;tr&gt;&lt;/thead&gt;

我在这里遗漏了什么吗?任何帮助将不胜感激。

【问题讨论】:

标签: php html regex html-content-extraction


【解决方案1】:

您的问题(如 regex101 所述)是

"\s matches any whitespace character (equal to [\r\n\t\f\v ])"

因此,您的正则表达式需要数据表中的 e 和不存在的“之间的空白字符。如果您想在该 e 和“之间允许零个或多个空格,您需要将您的正则表达式更改为

<table class=\"datatable\s*\">(.*?)<\/table>

请注意,在正则表达式中转义 " 不是必需的(但我认为它们在那里是因为您的正则表达式是带引号的字符串)。

其他人所说的不使用正则表达式来解析 HTML 是非常正确的;例如,如果嵌套了两个具有“datatable”类的表,则此正则表达式将失败。如果使用其他类实例化数据表,它也会失败。使用为此目的构建的 PHP 工具要好得多。

【讨论】:

    【解决方案2】:

    志愿者非常非常频繁地敦促开发人员使用 DomDocument,但很少有人真正编写出可行的解决方案。 ...所以我将提供一个使用 DomDocument 和 XPath 的解决方案。

    table 标记使用它的类来定位,item(0) 是它的第一个孩子。 saveHTML() 是您提取数据的方式。

    代码:(Demo)

    $html = <<<HTML
    <table class="datatable"><thead><tr><tr></thead></table>
    HTML;
    
    $dom=new DOMDocument; 
    $dom->loadHTML($html);
    $xpath = new DOMXPath($dom);
    $node = $xpath->evaluate("//table[contains(@class, 'datatable')]/*")->item(0);
    echo $dom->saveHTML($node);
    

    输出:

    <thead>
    <tr></tr>
    <tr></tr>
    </thead>
    

    *请注意,输出 dom 已“更正”,包含关闭 &lt;/tr&gt; 标记。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 2014-03-01
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      相关资源
      最近更新 更多