将HTML表格转换为文本

时间:2012-06-19 14:38:21

标签: php html text html-table

我正在开发一个需要将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个空格),然后将每列的宽度从%转换为空格数(基于colspanwidth <td>属性} 标签)。然后我将这些列宽减去每列中数据的strlen,以将pad_right所需的空格数归档到字符串,使所有内容垂直对齐。

我一直在那样工作,没有归档我想要的东西,但只是想知道它是不是愚蠢或者任何人都知道更好的方法请帮助我。

当涉及到多字节语言(日语,韩语等......)时,我不认为我的方法会起作用,因为它们的字符将超过一个空格并且最终会变得混乱。

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:11)

不要重新发明轮子。表格渲染很困难,只使用文本渲染表格更加困难。 为了阐明提供HTML所有功能的基于文本的表格渲染器的复杂性,请查看w3m,它是开源的: these 3000 lines of code只显示html表格。

将HTML转换为文本

有一些基于文本的浏览器可以被命令行使用,比如lynx。 您可以将您的html表fwrite转换为文件,将该文件传递到基于文本的浏览器并获取其输出。

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