Преобразование таблицы HTML в текст

Я работаю над проектом, который требует преобразования 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

моя идея заключается в анализе содержимого HTML с помощью DOMDocument. Затем я установлю ширину по умолчанию для таблицы (т. е.: 100 пробелов) , затем преобразую ширину каждого столбца из % в количество пробелов (на основе colspan & из <td> tag). Затем я вычитаю эту ширину столбца до strlen данных в каждом столбце для архивирования количества пробелов мне нужно pad_right к строке, чтобы все выровнять по вертикали.

Я работал таким образом, не был заархивирован, что я хочу, но просто интересно, глупо ли это или кто-нибудь знает лучший способ, пожалуйста, помогите мне.

также, Когда дело доходит до нескольких языках (японский, корейский и т. д...) Я не думаю, что мой подход будет работать, потому что их персонажи будут больше, чем одно пространство, и это в конечном итоге беспорядок.

может кто-нибудь помочь мне, пожалуйста?

1 ответов


не изобретайте колесо. Рендеринг таблиц затруднен, рендеринг таблиц с использованием только текста еще сложнее. Чтобы уточнить сложность текстового визуализатора таблиц, который предлагает все функции HTML, взгляните на w3m, который является открытым исходным кодом: эти 3000 строк кода есть только для отображения таблиц html.

преобразование HTML в текст

есть текстовые браузеры, которые могут использоваться командной строкой, например lynx. Ты мог бы!--2--> ваш html-таблица в файл, передайте этот файл в текстовый браузер и возьмите его вывод.

Примечание: текстовые браузеры обычно используются в оболочке, которая обычно отображается в моноширинном пространстве. Это остается необходимым условием.

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