Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конвертация html в txt, Почти работает, но 
:(
    Опции темы
Alek74
Дата 24.3.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Делаю так:

Код
//Определяем путь.
    $dir = $file;
// Читаем и выводим.
echo readfile($dir);


Выводит естественно страничку отформатированную html.

Но, есть один момент, может я изначально не правильно действую.
Нужно прочтать содержимое файла, заменить все теги на знаки переноса и вывести содержимое в виде текстового файла.
Вот пример.
Использовать такую функцию мне посоветовали.
Код
//Путь к файлу    $dir = $file;
// читаем его
$content = readfile($dir);

function html_to_text ($document)

{
$search = array ("'<script[^>]*?>.*?</script>'si",  // Au?acaao javaScript
                 "'<[\/\!]*?[^<>]*?>'si",           // Au?acaao HTML-oaae
                 "'([\r\n])[\s]+'",                 // Au?acaao i?iaaeuiua neiaieu
                 "'&(quot|#34);'i",                 // Caiaiyao HTML-nouiinoe
                 "'&(amp|#38);'i",
                 "'&(lt|#60);'i",
                 "'&(gt|#62);'i",
                 "'&(nbsp|#160);'i",
                 "'&(iexcl|#161);'i",
                 "'&(cent|#162);'i",
                 "'&(pound|#163);'i",
                 "'&(copy|#169);'i",
                 "'&#(\d+);'e");                    // eioa?i?aoe?iaaou eae php-eia

$replace = array ("",
                  "",
                  "\\1",
                  "\"",
                  "&",
                  "<",
                  ">",
                  " ",
                  chr(161),
                  chr(162),
                  chr(163),
                  chr(169),
                  "chr(\\1)");

$text = preg_replace($search, $replace, $document);
return $text;
}


html_to_text ($content);
echo "$text";


Может это вообще работать не будет
Точнее это работает как указано выше.

Это сообщение отредактировал(а) Alek74 - 24.3.2006, 18:42
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
DemoCode
Дата 24.3.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 890
Регистрация: 20.10.2005
Где: Россия

Репутация: 1
Всего: 41



А чем функция htmlentities() не подходит?


--------------------
Жить стало лучше, жить стало веселей
© И.В. Сталин 
PM MAIL ICQ   Вверх
Ciber SLasH
Дата 24.3.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Alek74, тебе посоветовали чушь. Делай так:
Код

$content = file_get_contents('./file.txt');
$content = htmlspecialchars($content, ENT_QUOTES);
echo $content;

PM   Вверх
Alek74
Дата 24.3.2006, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Цитата(Ciber SLasH @ 24.3.2006, 18:29)
Alek74, тебе посоветовали чушь. Делай так:
Код

$content = file_get_contents('./file.txt');
$content = htmlspecialchars($content, ENT_QUOTES);
echo $content;

Да. Вариант работает, но только не так как надо. Выводиться текст вместе с тегами.

А задача заменить теги на знаки переноса и отступы. Нужен на выходе текст вида
Код
  Кир БУЛЫЧЕВ

                           ТРИНАДЦАТЬ ЛЕТ ПУТИ



                                    1

     Сто шесть лет назад корабль "Антей" покинул Землю.
     И  как  не  велика  его  скорость,  как  ни  ничтожно   сопротивление
космического вакуума гигантской пуле, траектория полета которой  соединяет
уже неразличимую даже в самый мощный телескоп Землю и Альфу  Лебедя,  путь
займет в общей сложности сто девятнадцать земных лет.



Это сообщение отредактировал(а) Alek74 - 24.3.2006, 19:10
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
DemoCode
Дата 24.3.2006, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 890
Регистрация: 20.10.2005
Где: Россия

Репутация: 1
Всего: 41



Цитата(Alek74 @ 24.3.2006, 20:07 Найти цитируемый пост)
Выводиться текст вместе с тегами.


Не понимаю, а тебе как надо.
Если без тэгов, так
$text = strip_tags ($text);


--------------------
Жить стало лучше, жить стало веселей
© И.В. Сталин 
PM MAIL ICQ   Вверх
Alek74
Дата 24.3.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Нужна конвертация на лету html в txt.

Т.е. надо заменить теги текстовым форматированием. Убрать все лишнее.

Это сообщение отредактировал(а) Alek74 - 24.3.2006, 19:18
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
-=Ustas=-
Дата 24.3.2006, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 6
Всего: 69



Ну тебе же уже сказали:

Цитата(DemoCode @ 24.3.2006, 19:08 Найти цитируемый пост)
Если без тэгов, так
$text = strip_tags ($text);




--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Alek74
Дата 24.3.2006, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Ерунда какаята получаеться. Выводит почему-о с тегами.
Код

$content = file_get_contents($dir);
$content = htmlspecialchars($content, ENT_QUOTES);
$content = strip_tags($content);
echo $content;


Все, понял.
Надо зарезать

$content = htmlspecialchars($content, ENT_QUOTES);

Пардон, не увидел сообщение снизу.

Это сообщение отредактировал(а) Alek74 - 24.3.2006, 20:27
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
Aliance
Дата 24.3.2006, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 2
Всего: 137



Код

$content = file_get_contents($dir);
$content = strip_tags($content);
echo $content;

PM MAIL WWW ICQ Skype   Вверх
Alek74
Дата 24.3.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Это все не выход. Нужно сконвертировать html в txt.

Объясню зачем.

У меня в локальной сети довольно большая библиотека. Более 25 тыс+ 4 раза по столько не сортировано файлов html. Меня просят сделать возможность скачивать файлы в txt формате для КПК.

Вот и нужно сделать конвертацию на лету.
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
Ciber SLasH
Дата 24.3.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Цитата(Alek74 @ 24.3.2006, 20:32 Найти цитируемый пост)
Это все не выход. Нужно сконвертировать html в txt.

Тогда бери ту функцию (html_to_text) и дорабатывай — добавляй нужные реги для преобразования.

А вообще чем не устраивает последний предложенный вариант? Преобразовал файл, добавь ещё создание нового файла и запиши в новый файл преобразованный текст.

Это сообщение отредактировал(а) Ciber SLasH - 24.3.2006, 21:10
PM   Вверх
Alek74
Дата 24.3.2006, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Так последний вариант преобразует в текст без форматирования. Попробу почитать такой текст. Можно конечно попробовать преобразовыват по построчно . И так же его записать построчно в файл.


Код

Сергей Садов. Ответ (Баймер) Сергей Садов Ответ (Баймер). Мужчина атлетического телосложения бежал красиво, под загорелой кожей перекатывались бугры стальных мышц. Правда его шикарная одежда, явно купленная не на барахолке, мало предназначалась для бега, но это, похоже, мужчину заботило мало. Но вот испуганное выражение на лице резко контрастировало с мужественной красотой атлетической фигуры. Впрочем, в его испуге не было ничего удивительного - по пятам за мужчиной гналось еще несколько таких же 


Причем заголовок выводиться как часть текста файла:
Цитата

Сергей Садов. Ответ (Баймер) Сергей Садов Ответ (Баймер).


Жирно выделен заголовок.

Это сообщение отредактировал(а) Alek74 - 24.3.2006, 22:18
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
Alek74
Дата 24.3.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Может есть готовое решение для конвертации. Или я просто не правильно выбрал подход для решения проблемы?
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
ZlojEzh
Дата 25.3.2006, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 2
Всего: 15



PM MAIL ICQ   Вверх
Serkys
Дата 26.3.2006, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1061
Регистрация: 19.4.2004

Репутация: 2
Всего: 22



В php5 есть функция htmlspecialchars_decode, она делает то, что тебе нужно.
Вот моя самописная (для себя делал, сейчас подправил немного):
Код

function input_check_repeat($text) {
  $text=str_replace('&amp;', '&', $text);
  $text=str_replace('&quot;', '"', $text);
  $text=str_replace('&lt;', '<', $text);
  $text=str_replace('&gt;', '>', $text);
  $text=str_replace('<br />', "/r/n", $text);
  $text=str_replace('<br>',"/r/n", $text);
  return $text;
};

Делал её для действия, обратного nl2br() и htmlspecialchars().

З.Ы. При первом взгляде на этот топик возникает ощущение, что никто не вдумался в вопрос, но все сразу бросились отвечать, ссылаясь на некорректность вопроса. Такое ИМХО.
PM MAIL   Вверх
Alek74
Дата 26.3.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



В общем я либо что то не так делаю, либо ...

Эти два класса работают у меня так же как и strip_tags()

Просто удаляют все теги в тексте. А не форматирует в конечный текст. Куча-мала получаеться.

Это сообщение отредактировал(а) Alek74 - 26.3.2006, 17:18
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
Ciber SLasH
Дата 26.3.2006, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Alek74, вот к маленький пример:
Код

$fp1 = fopen('./test.htm', 'r');
$fp2 = fopen('./test.txt', 'w');
while (!feof($fp1)) fwrite($fp2, fgetss($fp1));
fclose($fp1);
fclose($fp2);

только получается много пустых строк на том месте, где кроме тэгов ничего текстового не было.
PM   Вверх
Alek74
Дата 27.3.2006, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Нет. Получаеться, что главы в нем в виде одной строки. Т.е. если между абзацами стоит пустая строка, то этот абзац представляеться в виде одной строки. Это можно посмотреть открыв текстовой файл в браузере.

А абзацы, не имеющие между собой пропуска выстраиваються в один абзац.

Пример:

Код

...Сварил ништяк..... 
        -  Пришел Блим Кололей с телкой, принес банку. 
        -  Буду отбивать то и другое.

ГЛАВА ЧЕТВЕРТАЯ.

Утро.
   Ночью Блим по заширке начал буянить и я его выгнал. Баба осталась.



Выглядит так
Код

Сварил ништяк. Пришел Блим Кололей с телкой, принес банку. Буду отбивать то и другое.


     ГЛАВА ЧЕТВЕРТАЯ.
    
   Утро.   Ночью Блим по заширке начал буянить и я его выгнал. Баба осталась.   


Но это уже прогресс!!!.

До этого был вообще один абзац!

Это сообщение отредактировал(а) Alek74 - 27.3.2006, 09:46
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
Alek74
Дата 27.3.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Попробовал использовать это так:
Код

$dir = 'file.html';
$content = file_get_contents($dir);
//$content = htmlspecialchars($content, ENT_QUOTES);
$text = strip_tags($content);

function input_check_repeat($text) {
  $text=str_replace('&amp;', '&', $text);
  $text=str_replace('&quot;', '"', $text);
  $text=str_replace('&lt;', '<', $text);
  $text=str_replace('&gt;', '>', $text);
  $text=str_replace('<br />', "/r/n", $text);
  $text=str_replace('<br>',"/r/n", $text);
  return $text;
};
$filetxt = input_check_repeat($text);
echo "$filetxt";


Выдает текст без абзацев.
Добавлено @ 21:26
У меня создаеться устойчивое впечатление, что я не правильно все делаю.

Это сообщение отредактировал(а) Alek74 - 27.3.2006, 21:22
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
Serkys
Дата 27.3.2006, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1061
Регистрация: 19.4.2004

Репутация: 2
Всего: 22



Цитата(Alek74 @ 27.3.2006, 21:17 Найти цитируемый пост)
Выдает текст без абзацев.

Попробуй вставить в функцию input_check_repeat()
Код

$text=str_replace("</p>", "\n", $text);

Добавлено @ 22:08
Цитата(Alek74 @ 27.3.2006, 21:17 Найти цитируемый пост)
У меня создаеться устойчивое впечатление, что я не правильно все делаю.

Нормально ты всё делаешь. Редко всё сразу получается. Надо стремиться к результату.
PM MAIL   Вверх
Alek74
Дата 27.3.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



А куда именно?

Код

$dir = 'file.html';
$content = file_get_contents($dir);
$text=str_replace("</p>", "\n", $text);
$text = strip_tags($content);


function input_check_repeat($text) {
  $text=str_replace('&amp;', '&', $text);
  $text=str_replace('&quot;', '"', $text);
  $text=str_replace('&lt;', '<', $text);
  $text=str_replace('&gt;', '>', $text);
  $text=str_replace('<br />', "/r/n", $text);
  $text=str_replace('<br>',"/r/n", $text);
  return $text;
};
$filetxt = input_check_repeat($text);
echo "$filetxt";

Так не помогает.

И наоборот тоже.

Это сообщение отредактировал(а) Alek74 - 28.3.2006, 05:09
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
Alek74
Дата 28.3.2006, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Задача усложняеться тем, что файлы помимо html содержат таблицы стилей, а они таким метедом не вырезаються.

Я не могу понять одного -



Вот есть два класса, в том числе с использованием парсера. Они у меня работают так же как и все остальные методы. Т.е. вырезают теги из html, но это можно сделать и с помощью функций пхп.

Вопрос - неужели люди писали все это только для того чтобы вырезать теги?
У меня создаеться впечатление, что я их не правильно использую. Но там есть рекомендации и я им следую.

Вот что пишет автор первого парсера
Цитата

This example is part of the project titled HTML Parser for PHP-4. It's a class named Html2Text which converts HTML to ASCII text, while attempting to preserve page formatting.

Этот пример - часть проекта названный HTML Parser для PHP-4 <index.php>. Это - класс по имени Html2Text, который конвертирует(преобразовывает) HTML к тексту ASCII, при попытке сохранить форматирование страницы.


Вот пример его использования(авторский)
[code=php]
<?
include ("html2text.inc");

$htmlText = "... HTML text here ...";
$asciiText = new Html2Text ($htmlText, 15); // 15 columns maximum
$text = $htmlToText->convert();
echo "Converted to: " . $text;

?>

Все сделал как рекомендовано
А при запуске пишет:

Цитата

Fatal error: Call to a member function convert() on a non-object in F:\server\INFO\BIBLIO\Convert\convert2.php on line 9




Это сообщение отредактировал(а) Alek74 - 28.3.2006, 09:20
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
-=Ustas=-
Дата 28.3.2006, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 6
Всего: 69



Я что-то не вижу, где у тебя создается экземпляр объекта $htmlToText !


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Alek74
Дата 28.3.2006, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Цитата(-=Ustas=- @ 28.3.2006, 09:32)
Я что-то не вижу, где у тебя создается экземпляр объекта $htmlToText !


А в каком виде надо присваивать экземпляр? Это должен быть объект или массив? С терминологией у меня плоховато smile

Это сообщение отредактировал(а) Alek74 - 28.3.2006, 10:03
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
-=Ustas=-
Дата 28.3.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 6
Всего: 69



Код

$объект = new Имя_Класса();



--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Alek74
Дата 28.3.2006, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



А в качестве объекта может выступать путь к файлу?
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
-=Ustas=-
Дата 28.3.2006, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 6
Всего: 69



Alek74, какой еще путь?! Можно так:
файл object.php
Код

<?php

class NameClass
{
    ...
}

$myObject = new NameClass();

?>

Файл other.php
Код

<?php

include("object.php");
$myObject->свойства;

?>


Это сообщение отредактировал(а) -=Ustas=- - 28.3.2006, 11:15


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Ciber SLasH
Дата 28.3.2006, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Alek74, вот, надыбал неплохую функцию (кстати, шла первой ссылкой в Гугле):
html2text.inc:
Код

<?php
/************************************************************
 Library to convert HTML into an approximate text equivalent
v1.0.3 update 28/11/2003 for better response with invalid HTML
and minor bugfix (incorrect declaration of a variable)
--> before <!--
? > before < ? (without the spaces ...)
</style> before <style
</script> before <script
*************************************************************

Please see http://www.howtocreate.co.uk/php/ for details
Please see http://www.howtocreate.co.uk/jslibs/termsOfUse.html for terms and
conditions of use

The reason this library was written was to convert HTML email contents into a text
based email content, where the rendering does not have to be as accurate as with
a text based browser. However, there must be many more uses for it.

This library attempts to deal with non-standard HTML, but may occasionally suffer
from problems with pages that are not properly written - most especially:
Tags written as <tagName attribute=somethingWithA"or'InItButNotSurroundedByQuotes>,
Closing </pre> or </textarea> tags without their corresponding opening tags,
Tags within <textarea> </textarea> tags, which will be rendered, even though they
should not be.

Conversion requires a lot of preg_replace statements, so it can be quite slow with
large HTML files.

******
To use
******

This library requires PHP 4+

To use this library, put the following line in your script before the part that needs it:
require('PATH_TO_THIS_FILE/html2text.php');

To convert HTML/PHP to text:
    $textVersion = html2text( $HTMLversion );

************
Further info
************

For the technically minded, this is the process I use for converting HTML to approx text:

REMOVE php start and end tags
REMOVE <!-- -->
ensure HTML uses entities in the right places (like inside tags) so strip_tags works properly
<STYLE|SCRIPT|OPTION>
carefully remove everything between them
strip_tags except the important ones
replace all \s that are after the start or a </pre> and before <pre> or end with a single space
</TITLE|HR>
\n          --------------------
<H1|H2|H3|H4|H5|H6|DIV|P|PRE>
\n\n
<SUP>
^
<UL|OL|BR|DL|DT|TABLE|CAPTION|TR->(TH|TD)>
\n
<LI>
\n·
<DD>
\n\t
<TH|TD>
\t
<A|AREA href=(!javascript:&&!#)>
[LINK:hrefWithout#]
<IMG>
[IMG:alt]
<FORM>
[FORM:action]
<INPUT|TEXTAREA|BUTTON|SELECT>
[INPUT]
strip tags again, leaving nothing this time
un-htmlspecialchars
word wrap (this will also affect pre, but as this is intended for email use, I don't care)

*/

function html2text( $badStr ) {
    //remove PHP if it exists
    while( substr_count( $badStr, '<'.'?' ) && substr_count( $badStr, '?'.'>' ) && strpos( $badStr, '?'.'>', strpos( $badStr, '<'.'?' ) ) > strpos( $badStr, '<'.'?' ) ) {
        $badStr = substr( $badStr, 0, strpos( $badStr, '<'.'?' ) ) . substr( $badStr, strpos( $badStr, '?'.'>', strpos( $badStr, '<'.'?' ) ) + 2 ); }
    //remove comments
    while( substr_count( $badStr, '<!--' ) && substr_count( $badStr, '-->' ) && strpos( $badStr, '-->', strpos( $badStr, '<!--' ) ) > strpos( $badStr, '<!--' ) ) {
        $badStr = substr( $badStr, 0, strpos( $badStr, '<!--' ) ) . substr( $badStr, strpos( $badStr, '-->', strpos( $badStr, '<!--' ) ) + 3 ); }
    //now make sure all HTML tags are correctly written (> not in between quotes)
    for( $x = 0, $goodStr = '', $is_open_tb = false, $is_open_sq = false, $is_open_dq = false; strlen( $chr = $badStr{$x} ); $x++ ) {
        //take each letter in turn and check if that character is permitted there
        switch( $chr ) {
            case '<':
                if( !$is_open_tb && strtolower( substr( $badStr, $x + 1, 5 ) ) == 'style' ) {
                    $badStr = substr( $badStr, 0, $x ) . substr( $badStr, strpos( strtolower( $badStr ), '</style>', $x ) + 7 ); $chr = '';
                } elseif( !$is_open_tb && strtolower( substr( $badStr, $x + 1, 6 ) ) == 'script' ) {
                    $badStr = substr( $badStr, 0, $x ) . substr( $badStr, strpos( strtolower( $badStr ), '</script>', $x ) + 8 ); $chr = '';
                } elseif( !$is_open_tb ) { $is_open_tb = true; } else { $chr = '&lt;'; }
                break;
            case '>':
                if( !$is_open_tb || $is_open_dq || $is_open_sq ) { $chr = '&gt;'; } else { $is_open_tb = false; }
                break;
            case '"':
                if( $is_open_tb && !$is_open_dq && !$is_open_sq ) { $is_open_dq = true; }
                elseif( $is_open_tb && $is_open_dq && !$is_open_sq ) { $is_open_dq = false; }
                else { $chr = '&quot;'; }
                break;
            case "'":
                if( $is_open_tb && !$is_open_dq && !$is_open_sq ) { $is_open_sq = true; }
                elseif( $is_open_tb && !$is_open_dq && $is_open_sq ) { $is_open_sq = false; }
        } $goodStr .= $chr;
    }
    //now that the page is valid (I hope) for strip_tags, strip all unwanted tags
    $goodStr = strip_tags( $goodStr, '<title><hr><h1><h2><h3><h4><h5><h6><div><p><pre><sup><ul><ol><br><dl><dt><table><caption><tr><li><dd><th><td><a><area><img><form><input><textarea><button><select><option>' );
    //strip extra whitespace except between <pre> and <textarea> tags
    $badStr = preg_split( "/<\/?pre[^>]*>/i", $goodStr );
    for( $x = 0; is_string( $badStr[$x] ); $x++ ) {
        if( $x % 2 ) { $badStr[$x] = '<pre>'.$badStr[$x].'</pre>'; } else {
            $goodStr = preg_split( "/<\/?textarea[^>]*>/i", $badStr[$x] );
            for( $z = 0; is_string( $goodStr[$z] ); $z++ ) {
                if( $z % 2 ) { $goodStr[$z] = '<textarea>'.$goodStr[$z].'</textarea>'; } else {
                    $goodStr[$z] = preg_replace( "/\s+/", ' ', $goodStr[$z] );
            } }
            $badStr[$x] = implode('',$goodStr);
    } }
    $goodStr = implode('',$badStr);
    //remove all options from select inputs
    $goodStr = preg_replace( "/<option[^>]*>[^<]*/i", '', $goodStr );
    //replace all tags with their text equivalents
    $goodStr = preg_replace( "/<(\/title|hr)[^>]*>/i", "\n          --------------------\n", $goodStr );
    $goodStr = preg_replace( "/<(h|div|p)[^>]*>/i", "\n\n", $goodStr );
    $goodStr = preg_replace( "/<sup[^>]*>/i", '^', $goodStr );
    $goodStr = preg_replace( "/<(ul|ol|br|dl|dt|table|caption|\/textarea|tr[^>]*>\s*<(td|th))[^>]*>/i", "\n", $goodStr );
    $goodStr = preg_replace( "/<li[^>]*>/i", "\n· ", $goodStr );
    $goodStr = preg_replace( "/<dd[^>]*>/i", "\n\t", $goodStr );
    $goodStr = preg_replace( "/<(th|td)[^>]*>/i", "\t", $goodStr );
    $goodStr = preg_replace( "/<a[^>]* href=(\"((?!\"|#|javascript:)[^\"#]*)(\"|#)|'((?!'|#|javascript:)[^'#]*)('|#)|((?!'|\"|>|#|javascript:)[^#\"'> ]*))[^>]*>/i", "[LINK: $2$4$6] ", $goodStr );
    $goodStr = preg_replace( "/<img[^>]* alt=(\"([^\"]+)\"|'([^']+)'|([^\"'> ]+))[^>]*>/i", "[IMAGE: $2$3$4] ", $goodStr );
    $goodStr = preg_replace( "/<form[^>]* action=(\"([^\"]+)\"|'([^']+)'|([^\"'> ]+))[^>]*>/i", "\n[FORM: $2$3$4] ", $goodStr );
    $goodStr = preg_replace( "/<(input|textarea|button|select)[^>]*>/i", "[INPUT] ", $goodStr );
    //strip all remaining tags (mostly closing tags)
    $goodStr = strip_tags( $goodStr );
    //convert HTML entities
    $goodStr = strtr( $goodStr, array_flip( get_html_translation_table( HTML_ENTITIES ) ) );
    preg_replace( "/&#(\d+);/me", "chr('$1')", $goodStr );
    //wordwrap
    $goodStr = wordwrap( $goodStr );
    //make sure there are no more than 3 linebreaks in a row and trim whitespace
    return preg_replace( "/^\n*|\n*$/", '', preg_replace( "/[ \t]+(\n|$)/", "$1", preg_replace( "/\n(\s*\n){2}/", "\n\n\n", preg_replace( "/\r\n?|\f/", "\n", str_replace( chr(160), ' ', $goodStr ) ) ) ) );
}
?>

PM   Вверх
Serkys
Дата 28.3.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1061
Регистрация: 19.4.2004

Репутация: 2
Всего: 22



Ciber SLasH, блин, сильная функция.
Глаза вспотели читать smile
Alek74, советую попробовать.
PM MAIL   Вверх
Alek74
Дата 28.3.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Если сделать с этой функцией так:
Код

require('html2text2.inc');


    $textVersion = html2text( "<b>bold</b><br><b>bold</b>" );
  echo "Converted to: " . $textVersion;


То строки
Код

bold 

bold



выводяться так:


Код

bold bold

--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
Serkys
Дата 28.3.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1061
Регистрация: 19.4.2004

Репутация: 2
Всего: 22



Попробуй так:
Код

require('html2text2.inc');    
    $textVersion = html2text( "<b>bold</b><br><b>bold</b>" );    
    $textVersion = str_replace("<br>", "\r\n", $textVersion);
  echo "Converted to: " . $textVersion;


А вообще странно. Теги
Код

<b>bold</b><br><b>bold</b>

должны выводиться без перехода строки между ними:
Код

bold    
bold

PM MAIL   Вверх
Alek74
Дата 28.3.2006, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Кажеться я понял, что дурак.

В браузере все и должно выводиться в одну строку/абзац.
Мы же передаем ему текст без тегов. И эткуда ему знать, что это именно текст?

Нужно попробовать записать это все в файл и посмотреть именно этот файл.
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
ZlojEzh
Дата 28.3.2006, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 2
Всего: 15



просто укажи браузеру тип содержимого :
Код

header('Content-type: text/plain');

PM MAIL ICQ   Вверх
Alek74
Дата 29.3.2006, 05:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



В общем я был прав - я дурак. Есои указать тип содержимого, то все работает.

Код

require('html2text2.inc');
    $textVersion = html2text( "<b>bold</b><br><b>bold</b>" );
    $textVersion = str_replace("<br>", "\r\n", $textVersion);

header('Content-type: text/plain');
  echo "Converted to: " . $textVersion;



Буду пробовать с применением классов.
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0930 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.