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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конвертация html в txt, Почти работает, но 
:(
    Опции темы
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('&', '&', $text);
  $text=str_replace('"', '"', $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   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




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


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

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