crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Надо написать html браузер
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
molchanoviv Дата 19.11.2008, 20:20
 
Цитата(bynet @ 19.11.2008, 10:59) *
Как из строки asd <h1>qwe</h2> удалить к примеру <h1> чтобы строка стала asd qwe</h2> fgh


функцией remove.

Совет: Смотри ассистент.
Litkevich Yuriy Дата 19.11.2008, 19:04
 
Цитата(fsMark @ 19.11.2008, 19:55) *
Помоему надо строить дерево отрожающее структуру HTML файла
это DOM-подход, он сложен.

Цитата(bynet @ 19.11.2008, 15:38) *
Огромное спасибо, но мне минимум можно использовать стандартных функций. Все практически надо написать самому. Тоесть если строку парсить то надо написать свой парсер
это я понял, я и предлагаю тебе свой парсер написать, но несквозной. А в стиле SAX, т.е. ты создаешь свой класс обзываешь его к примеру MySAX. Интерфейс выглядит примерно так:
Интерфейс

#ifndef MYSAX_H
#define MYSAX_H

class QString;
class QFile;


/*!    SAX парсер.
*/
class MySAX
{


public:
    MySAX();
    ~MySAX();

    /*!    Загрузчик.
     *    
     *    Загружает файл в память и вызывает приватный метод start(), для анализа.
     *
     *    \param    file - файл для разбора.    
     *    \return    false - если неудалось загрузить файл или он неправильный.
     */
    bool load(const QFile &file);

    /*!    Обработчик открывающегося тэга.
     *    \param    tag - имя тэга.
     *    \param    text - текст следующий за тэгом (до символа "<").    
     *    \return    false - если необходимо прервать анализ.
     */
    virtual bool openTag(const QString &tag);

    /*!    Обработчик текста в нутри тэга.
     *    \param    text - текст следующий за тэгом (до символа "<").    
     *    \return    false - если необходимо прервать анализ.
     */
    virtual bool text(const QString &text);    
    
    /*!    Обработчик закрывающегося тэга.
     *    \param    tag - имя тэга.
     *    \return    false - если необходимо прервать анализ.        
     */
    virtual bool closeTag(const QString& tag);  

private:
    /*!    Сам синтаксический анализатор.
     */
    void start();

    int old_pos;
};

#endif //MYSAX_H



В функции start(), собственно парсере, ты ищещ тэги (закрывающий и открывающий).
Помере того как ты их находишь, вызываешь соответствующие методы. Например ты нашел открывающийся тэг, вызвал openTag(const QString &tag), в качестве аргумента передаешь имя тэга. Запоминашь позицию (номер символа)курсора сразу после тэга, ищешь слудющий тэг (или закрывающий или открывающий), когда нашел, то сначало берешь текст от запомненой позиции до текущей, передаешь его в text(const QString &text) затем вызываешь closeTag или openTag в зависимости от того какой тэг нашел. и т.д.

А вот заготовка реализации:
реализация

MySAX::MySAX()
{
}

MySAX::~MySAX()
{
}

bool MySAX::load(const QFile &file)
{
    if (!file.open(QIODevice::ReadOnly))
    {
        qDebug() << "Error: file " << file.fileName() << "is absent";
        return false;
    }

    qDebug() << "Open file: " << file.fileName();
    
    ...
    ...
    ...
    
}

bool MySAX::openTag(const QString &tag)
{
    qDebug() << "Open tag: " << tag;
}

bool MySAX::text(const QString &text)
{
    qDebug() << "\tIn tag text: " << text;
}

bool MySAX::closeTag(const QString &tag)
{
    qDebug() << "Close tag: " << tag;
}

void MySAX::start()
{
  QString    otag, ctag, text;
    
    // анализируем
    while(/*пока файл некончился*/)
    {
        ...
        // Нашли открывающийся тэг
        if (!openTag(otag))
            return;
        
        ...
        // Нашли закрывающийся тэг
        
            // читаем текст от старой позиции до новой
        text = ...;
        if (!text(text))
            return;
            
        if (!closeTag(ctag))
            return;
    }

}

trdm Дата 19.11.2008, 17:34
 
Цитата(bynet @ 19.11.2008, 10:59) *
Как из строки asd <h1>qwe</h2> удалить к примеру <h1> чтобы строка стала asd qwe</h2> fgh


QString.replace();
Месь, рекомендую покурить Ассистант. Он всегда поможет.

Цитата(bynet @ 19.11.2008, 16:09) *
Для каждой строки, как я понимаю надо вытянуть тег и текст который находится между им. Может кто посоветует чего?

Поищите в интернете букварь по патернам, а в букваре поищите "рекурсивная композиция" или погуглите по "рекурсивная композиция/рекурсивный спуск".
например тут: http://code.google.com/p/unnstudio/downloads/list

http://ru.wikipedia.org/wiki/Метод_рекурсивного_спуска
fsMark Дата 19.11.2008, 16:55
  Помоему надо строить дерево отрожающее структуру HTML файла

Например:
<HTML>
текст
<br>
<b>
жырный текст
</b>
снова текст
</HTML>

Пример такого простейшего дерева приведен в прикрепленном файле, потом ты будешь обходить это дерево и отображать его.

Без такой древовидной структуры будет сложно учитывать вложенность тегов например для таблиц.
bynet Дата 19.11.2008, 16:09
  Вот к чему я пришел
CODE

void Parser::open()
{ QString szLine;
QString absFileName = QFileDialog::getOpenFileName(this,"Open File","","HTML files (*.html;*.htm)");
QFile file(absFileName);
if (file.open(QIODevice::ReadOnly)){
QTextStream out(&file);

do
{
szLine = out.readLine();

htmltostr(szLine);
//textEdit->(szLine);
}while( !szLine.isNull());

}

file.close();
}

void Parser::htmltostr(QString& htmstr)
{

Сюда приходит строка которую мне надо обработать!!!!!!!
}


Для каждой строки, как я понимаю надо вытянуть тег и текст который находится между им. Может кто посоветует чего?
AD Дата 19.11.2008, 13:09
  QString & QString::remove ( const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive )
QString & QString::remove ( QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive )
Цитата
QString & QString::remove ( const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive )
This is an overloaded member function, provided for convenience.
Removes every occurrence of the given str string in this string, and returns a reference to this string.
If cs is Qt::CaseSensitive (the default), the search is case sensitive; otherwise the search is case insensitive.
This is the same as replace(str, "", cs).
See also replace().

QString & QString::remove ( QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive )
This is an overloaded member function, provided for convenience.
Removes every occurrence of the character ch in this string, and returns a reference to this string.
If cs is Qt::CaseSensitive (the default), the search is case sensitive; otherwise the search is case insensitive.
Example:
QString t = "Ali Baba";
t.remove(QChar('a'), Qt::CaseInsensitive);
// t == "li Bb"
This is the same as replace(ch, "", cs).


QString & QString::replace ( const QString & before, const QString & after, Qt::CaseSensitivity cs = Qt::CaseSensitive )
Цитата
QString & QString::replace ( const QString & before, const QString & after, Qt::CaseSensitivity cs = Qt::CaseSensitive )
This is an overloaded member function, provided for convenience.
Replaces every occurrence of the string before with the string after.
If cs is Qt::CaseSensitive (the default), the search is case sensitive; otherwise the search is case insensitive.
Example:
QString str = "colour behaviour flavour neighbour";
str.replace(QString("ou"), QString("o"));
// str == "color behavior flavor neighbor"
bynet Дата 19.11.2008, 12:38
  Огромное спасибо, но мне минимум можно использовать стандартных функций. Все практически надо написать самому. Тоесть если строку парсить то надо написать свой парсер
Litkevich Yuriy Дата 19.11.2008, 11:55
  bynet, яб тебе всетаки рекомендовал использовать подход SAX, т.к. ты можешь использовать С++.

Т.е. ты создаешь класс SAX-парсера, передаешь ему файл, а он выпоняет поиск тэгов. Посмотри примеры Qt'явые по SAX'у.
в наследнике своего SAX-парсера переопределяешь функции такого вида:
openTag(QString tag, QString text)
closeTag(QString tag)

первая вызывается парсером, когда он обнаруживает открывающийся текст, и в нее парсер передает имя тэга "foo" (<foo>) и строку, которую он обнаружил от этого отрывающегося тэга до символа "<"

вторая вызывается, когда парсер обнаружил закрывающийся тэг "bar" (</bar>).
bynet Дата 19.11.2008, 10:59
  Ок!
Вот у меня есть строка Qstring str="asd <h1>qwe</h2> fgh";

Делаю следующее

QChar p;
for (int i=0;i<str.size();++i);
{
if(str.at(i)== QChar('<'))

Как из строки asd <h1>qwe</h2> удалить к примеру <h1> чтобы строка стала asd qwe</h2> fgh
AD Дата 19.11.2008, 0:50
  А что именно хочешь? Я не очень понимаю. Вот так обращаться к ним:
QString string = "Hello, World!";
for(int i=0; i<str.size(); ++i)
{
    QChar p = string[i];
     // какие-то действия с этим символом
}

Или еще что-то? :)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 16.3.2025, 21:53