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

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

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

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

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

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

【问题讨论】:

标签: php html regex html-table html-parsing


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2023-04-03
    • 2011-06-26
    相关资源
    最近更新 更多