所以我正在使用 regex101.com 来测试我的字符串,但我无法获得我需要的输出。我制作的样品可以在这里查看 https://regex101.com/r/YQTW4c/2。
所以我的正则表达式是这样的:
<table class="datatables">(.*?)</table>
和示例字符串:
<table class="datatable"><thead><tr><tr></thead></table>
我想获取表类数据表中的所有内容,在本例中,该表<thead><tr><tr></thead>
.
我在这里错过了什么吗?任何帮助将不胜感激。
您的问题(如正则表达式101所述(是
"s matches any whitespace character (equal to [rntfv ])"
所以你的正则表达式需要在数据表中的 e 和不存在的"之间有一个空格字符。如果要在该 e 和 " 之间允许零个或多个空格,则需要将正则表达式更改为
<table class="datatables*">(.*?)</table>
请注意,在正则表达式中转义 " 是不必要的(但我认为它们在那里,因为您的正则表达式是一个带引号的字符串(。
其他人关于不使用正则表达式来解析HTML的说法是非常正确的;例如,如果嵌套了两个带有类"datatable"的表,则此正则表达式将失败。如果使用其他类实例化数据表,它也会失败。使用为此目的而构建的PHP工具要好得多。
敦促开发人员使用DomDocument,但很少有人真正编写一个可行的解决方案。 ...所以我将提供一个使用DomDocument和XPath的解决方案。
表标记使用其类作为目标,item(0)
是其第一个子标记。 saveHTML()
是提取数据的方式。
代码:(演示(
$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 已"更正",包含结束</tr>
标记。