Преобразование таблицы 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
данных в каждом столбце, чтобы заархивировать количество пробелов, которые мне нужно добавить в строку, чтобы все выровнять по вертикали.
Я работал таким образом, не было заархивировано то, что я хочу, но просто интересно, глупо ли это или кто-нибудь знает лучший способ, пожалуйста, помогите мне.
Также, когда дело доходит до многобайтовых языков (японский, корейский и т. Д.) Я не думаю, что мой подход сработает, потому что их персонажи будут больше одного космос, и все заканчивается беспорядком.
Кто-нибудь может мне помочь, пожалуйста?
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