正则表达式 - 从 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('/(您需要执行非贪婪匹配:/(<table[^>]*>(?:.|\n)*?<\/table>)/
。注意问号:?
。
但是,我会为此使用 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)(如果你不想匹配结束标签,你可以使用前瞻,
preg_match_all('/(<table[^>]*>(?:.|\n)*(?=<\/table>))/', $aFile['sContent'], $aMatches);
【讨论】:
以上是关于正则表达式 - 从 PHP 中的 html 字符串获取表格的主要内容,如果未能解决你的问题,请参考以下文章