如何在 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>
标记。
所以我正在使用 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>
标记。