9

私は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。次に、各列のデータのこれらの列幅を減算して、すべてを垂直に揃えるために文字列にpad_rightする必要があるスペースの数をアーカイブします。width<td>strlen

私はそのように取り組んできましたが、私が望むものはアーカイブされていませんが、それが愚かであるか、誰かがより良い方法を知っているかどうか疑問に思っています。私を助けてください。

また、マルチバイト言語(日本語、韓国語など)に関しては、文字が1スペースより大きくなり、混乱してしまうため、私のアプローチはうまくいかないと思います。

誰かが私を助けてくれますか?

4

1 に答える 1

11

車輪の再発明をしないでください。テーブルのレンダリングは難しく、テキストのみを使用したテーブルのレンダリングはさらに困難です。HTMLのすべての機能を提供するテキストベースのテーブルレンダラーの複雑さを明確にするために、オープンソースであるw3mを見てください。 これらの3000行のコードは、htmlテーブルを表示するためだけにあります。

HTMLをテキストに変換する

lynxのように、コマンドラインで使用できるテキストベースのブラウザがあります。fwriteHTMLテーブルをファイルに変換し、そのファイルをテキストベースのブラウザに渡して、その出力を取得することができます。

注:テキストベースのブラウザは通常、シェルで使用され、シェルは通常、モノスペースで表示されます。これは前提条件のままです。

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ソリューションが必要な場合は、テーブルレンダラーを備えたPHP用のコンソールアプリケーションを対象としたフレームワーク( https://github.com/c9s/CLIFramework )も少なくとも1つあります。

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

于 2012-06-19T15:02:48.957 に答える