Преобразование таблицы 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 & width атрибут тега <td>). потом я вычтет ширину этих столбцов до strlen данных в каждом столбце, чтобы заархивировать количество пробелов, которые мне нужно добавить в строку, чтобы все выровнять по вертикали.

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

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

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

Author: Brian Tompsett - 汤莱恩, 2012-06-19

1 answers

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

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

Существуют текстовые браузеры, которые можно использовать с помощью командной строки, например lynx. Вы могли бы fwrite превратить вашу 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

 11
Author: Roman, 2018-03-12 11:15:52