如何在 php 中使用正则表达式正确获取 table 中的所有 html 元素?

How to properly get all html elements inside a table using regex in php?

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

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

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

和示例字符串:

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

我想获取 table class 数据 table 中的所有内容,在本例中为 <thead><tr><tr></thead>.

我是不是漏掉了什么?任何帮助将不胜感激。

您的问题(如 regex101 所述)是

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

所以你的正则表达式需要在数据表中的 e 和 " 之间有一个空白字符,而这不存在。如果你想在 e 和 " 之间允许零个或多个空格,你需要更改你的正则表达式到

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

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

其他人关于不使用正则表达式解析的说法 HTML 是非常正确的;例如,如果嵌套了带有 class "datatable" 的两个表,则此正则表达式将失败。如果使用额外的 classes 实例化数据表,它也会失败。最好使用为此目的构建的 PHP 工具。

志愿者们非常、非常经常地敦促开发人员使用 DomDocument,但是非常、非常 seldom 是否有人真正编写了一个可行的解决方案。 ...所以我将提供一个使用 DomDocument 和 XPath 的解决方案。

table 标记使用其 class 定位,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 是 "corrected",其中包含结束 </tr> 标记。