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



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

相关内容

  • 没有找到相关文章

最新更新