正则表达式 - 从 PHP 中的 html 字符串获取表格

Posted

技术标签:

【中文标题】正则表达式 - 从 PHP 中的 html 字符串获取表格【英文标题】:Regular Expression - get tables from html string in PHP 【发布时间】:2014-09-23 02:23:17 【问题描述】:

我尝试使用特殊的 div 容器将所有表格包装在我的内容中,以使它们可用于移动设备。 在将表格保存在自定义 CSS 的数据库中之前,我无法包装表格。在内容打印在页面上之前,我设法获得了内容,我需要 preg_replace 那里的所有表格。

我这样做是为了获取所有表格:

preg_match_all('/(<table[^>]*>(?:.|\n)*<\/table>)/', $aFile['sContent'], $aMatches);

问题是让内部(?:.|\n)* 匹配标签内的所有内容,而不匹配结束标签。现在表达式匹配所有内容,甚至是表格​​的结束标记...

有没有办法排除结束标签的匹配?

【问题讨论】:

"有没有办法排除结束标签的匹配?" - 使用 html 解析器而不是正则表达式 你应该使用惰性匹配模型,试试:preg_match_all('/(]*>(?:.|\n)*?)/', $aFile['sContent'], $aMatches); 首先——你不应该在不需要的时候使用正则表达式。其次,在这里阅读:***.com/questions/1732348/… 最后使用 hek2mgl 答案RegEx match open tags except XHTML self-contained tags的可能重复
【参考方案1】:

您需要执行非贪婪匹配:/(&lt;table[^&gt;]*&gt;(?:.|\n)*?&lt;\/table&gt;)/。注意问号:?

但是,我会为此使用 DOM 解析器:

$doc = new DOMDocument();
$doc->loadHTML($html);

$tables = $doc->getElementsByTagName('table');
foreach($tables as $table) 
    $content = $doc->saveHTML($table); 

虽然使用 DOM 解析器从 HTML 文档中提取数据已经更方便了,但如果您尝试修改 HTML(如您所说),它绝对是更好的解决方案。

【讨论】:

+1 避免使用正则表达式来解析非正则语言的 HTML,因此不应被正则表达式解析。 谢谢!非贪婪匹配成功了!我的最终正则表达式:/(?m)(]*>(?:.|\n|\r)*?)/ 我对 DOM 解析器不太熟悉,但是我会尝试实现这个版本。如果我做对了,我会改用这个。非常感谢:) 不客气。只需复制我发布的代码即可。该示例旨在成为工作代码。对我不起作用……至少现在是这样。似乎有一些命名空间错误。它找不到 DOMDocument() ...可能没有安装 php 扩展或类似的东西。但是正则表达式现在可以工作,当我们的高级开发人员回来时,我会尝试再次更改它。完成后,我会尽量记住在此处发布结果。再次感谢!@Jozze 如果您在命名空间中工作,则需要使用 \DOMDocument .. 注意 `\` 寻址全局 PHP 命名空间。
【参考方案2】:

如果你不想匹配结束标签,你可以使用前瞻,

preg_match_all('/(<table[^>]*>(?:.|\n)*(?=<\/table>))/', $aFile['sContent'], $aMatches);

【讨论】:

以上是关于正则表达式 - 从 PHP 中的 html 字符串获取表格的主要内容,如果未能解决你的问题,请参考以下文章

PHP:正则表达式替换,同时忽略html标签之间的内容

PHP正则表达式

PHP正则表达式详解

php正则常用表达式

php 怎样判断一个字符串为正则表达式

前端学PHP之正则表达式基础语法