将HTML表格转换为文本

10

我正在开发一个项目,需要将HTML电子邮件转换为纯文本。以下是HTML代码的简化版本:

<table>
    <tr>
        <td width="10%"></td>
        <td width="60%"> test product </td>
        <td width="20%">5</td>
        <td width="10%"> £50.00 </td>
    </tr>
    <tr>
        <td></td>
        <td colspan="3" width="100%"> Project Name: Test Project </td>
    </tr>
    <tr>
        <td width="10%"> </td>
        <td colspan="2" width="80%"> Page 1 : 01 New York 1.jpg </td>
        <td width="10%"> £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个空格),然后将每列的宽度从百分比转换为空格数(基于标签的colspan和width属性)。接着将这些列宽度从每列数据的strlen中减去,以获得需要填充右侧空格以使所有字符串垂直对齐的空格数。

我已经尝试了这种方式,但还没有达到想要的效果,我只是想知道是否有更好的方法,请帮帮我。

另外,当涉及多字节语言(日语、韩语等)时,我认为我的方法行不通,因为它们的字符会比一个空格大,最终会变得混乱不堪。

请有人能帮帮我吗?


4
只有在使用等宽字体显示文本时才可以实现这一点。 - Roman
3
啥?在你的文本文件中,多字节字符不会(或不应该)占用更多的空间。 - PeeHaa
1
如果有一列比您预期的宽,您会怎么做? - Madara's Ghost
1
将边框宽度简单设置为“0”。 - nmkyuppie
请查看这个答案,以获取更完整的解决方案。 - Arnold
显示剩余6条评论
1个回答

11

不要重复发明轮子。表格呈现很困难,仅使用文本呈现表格更加困难。 为了澄清一个提供 HTML 所有功能的基于文本的表格渲染器的复杂性,请看看开源软件 w3m: 这些 3000 行代码 只用于显示HTML表格。

将HTML转换为文本

有一些可以通过命令行使用的基于文本的浏览器,比如lynx。 您可以将html表格写入文件中,将该文件传递给基于文本的浏览器并获取其输出。

注意:基于文本的浏览器通常在 shell 中使用, 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


谢谢,问题在于这种转换必须是自动的,并且是我们公司软件的一部分,该软件在Windows服务器上运行,所以我无法安装Lynx。 - Olizt
1
哦,我以为它是自动的。想法是自动化它。PHP编写文件并执行(shell_exec)浏览器。我会添加一个代码示例。 - Roman
@Olizt 请看上面:“lynx和w3m在Windows上都可用”! - feeela
@feeela,我在更新中添加了关于Windows的部分,因为他说它需要在Windows上运行 ;) - Roman
谢谢Roman,我会尝试一下并告诉你它是否有效。 :) - Olizt
好主意。我测试了两个,但最终选择了Lynx,因为它对文本对齐应用更好。需要注意的是,如果输出旨在用于电子邮件,则根据环境需要进行换行符转换。我的环境是Linux,生成了"\n"的行尾,但纯文本电子邮件需要"\r\n"的行尾。 - jimp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接