将 HTML 表格转换为文本
Posted
技术标签:
【中文标题】将 HTML 表格转换为文本【英文标题】:Convert HTML table to text 【发布时间】:2012-06-21 15:09:36 【问题描述】:我正在做一个需要将 html 电子邮件转换为文本的项目。以下是 HTML 代码的简化版本:
<table>
<tr>
<td ></td>
<td > test product </td>
<td >5</td>
<td > £50.00 </td>
</tr>
<tr>
<td></td>
<td colspan="3" > Project Name: Test Project </td>
</tr>
<tr>
<td > </td>
<td colspan="2" > Page 1 : 01 New York 1.jpg </td>
<td > £0.00 </td>
</tr>
</table>
文本文件中的预期结果应如下所示(列对齐良好):
test product 5 £50.00
Project Name: Test Project
Page 1 : 01 New York 1.jpg £0.00
我的想法是通过 DOMDocument 解析 HTML 内容。然后我将为表格设置一个默认宽度(即:100 个空格),然后将每列的宽度从 % 转换为空格数(基于 <td>
标签的colspan
和width
属性)。然后,我将这些列宽减去每列数据的strlen
,以归档我需要 pad_right 到字符串的空格数,以使所有内容垂直对齐。
我一直在这样工作,还没有归档我想要的内容,但只是想知道这是否是愚蠢的,或者有人知道更好的方法,请帮助我。
此外,当涉及到多字节语言(日语、韩语等)时,我认为我的方法不会奏效,因为它们的字符会大于一个空格并且最终会变得一团糟。
有人可以帮帮我吗?
【问题讨论】:
这只有在文本以等宽字体显示时才有效。 嗯?多字节不(/不应该)在您的 txtfile 中占用更多空间。 如果有一列比您预期的要宽,您会怎么做? @roman:是的,我也这么认为,但还没有找到更好的解决方案。 只需将边框宽度设置为'0' 【参考方案1】:不要重新发明***。表格渲染很困难,仅使用文本渲染表格更加困难。 为了阐明提供 HTML 的所有功能的基于文本的表格渲染器的复杂性,请查看 w3m,它是开源的: these 3000 lines of code 仅用于显示 html 表格。
将 HTML 转换为文本
有一些基于文本的浏览器可以通过命令行使用,例如 lynx。
您可以fwrite
将您的 html 表放入一个文件中,将该文件传递到基于文本的浏览器中并获取其输出。
注意:基于文本的浏览器通常在 shell 中使用,它通常以等宽显示。这仍然是一个先决条件。
lynx 和 w3m 都可以在 Windows 上使用,你不需要“安装”它们,你只需要拥有可执行文件和从 php 运行它们的权限。
代码示例:
<?php
$table = '<table><tr><td>foo</td><td>bar</td></tr></table>'; //this contains your table
$html = "<html><body>$table</body></html>";
//write html file
$tmpfname = tempnam(sys_get_temp_dir(), "tblemail");
$handle = fopen($tmpfname, "w");
fwrite($handle, $html);
fclose($handle);
$myTextTable = shell_exec("w3m.exe -dump \"$tmpfname\"");
unlink($tmpfname);
w3m.exe
需要在您的工作目录中。
(没试过)
渲染文本表格
如果您想要一个原生 PHP 解决方案,至少还有一个框架 (https://github.com/c9s/CLIFramework) 针对 PHP 的控制台应用程序,它有一个表格渲染器。
它不会将 HTML 转换为文本,但它可以帮助您构建一个支持多行单元格的文本格式表格(这似乎是最复杂的部分)。
使用 CLIFramework 您需要这样的代码来呈现您的表格:
<?php
require 'vendor/autoload.php';
use CLIFramework\Component\Table\Table;
$table = new Table;
$table->addRow(array(
"test product", "5", "£50.00"
));
$table->addRow(array(
"Project Name: Test Project", "", ""
));
$table->addRow(array(
"Page 1 : 01 New York 1.jpg", "", "£0.00"
));
$myTextTable = $table->render();
CLIFramework 表格渲染器似乎不支持任何类似于“colspan”的东西。
这里是表格组件的文档:https://github.com/c9s/CLIFramework/wiki/Using-Table-Component
【讨论】:
谢谢,问题是这种转换必须是自动的,并且是我们公司软件的一部分,它在 Window 服务器上运行,所以我无法真正安装 Lynx 哦,我以为是自动的。这个想法是自动化它。 PHP 写入文件并执行 (shell_exec) 浏览器。我将添加一个代码示例 @Olizt 见上文:“lynx 和 w3m 在 Windows 上都可用”! @feeela 我在更新中添加了关于 windows 的部分,在他说它需要在 windows 上运行之后;) 感谢 Roman,我会试一试,让您知道它是否有效。 :)以上是关于将 HTML 表格转换为文本的主要内容,如果未能解决你的问题,请参考以下文章