самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 04.02.13 10:25
Оценка: :)
Всем привет

существует огромный документ такого вида

<any html tag> ... plain text ... <any html tag>

хранится он в std::wstring ...

какой самый быстрый способ удалить все <any html tag> ?
Re: самый быстрый способ удалить все <any html tag>
От: jazzer Россия Skype: enerjazzer
Дата: 04.02.13 10:29
Оценка: :)
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>Всем привет


J>существует огромный документ такого вида


J><any html tag> ... plain text ... <any html tag>


J>хранится он в std::wstring ...


J>какой самый быстрый способ удалить все <any html tag> ?


Если этот тег не встречается больше нигде, то регэкспом, вестимо.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 04.02.13 10:39
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Если этот тег не встречается больше нигде, то регэкспом, вестимо.


ой что то я не уверен ...

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

так что думаю стоит рассматривать только реализацию на голых указателях ...


просто это команда в гуи и она должна мгновенно выдавать результат ...
Re: самый быстрый способ удалить все <any html tag>
От: samius Япония http://sams-tricks.blogspot.com
Дата: 04.02.13 10:42
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>какой самый быстрый способ удалить все <any html tag> ?

А что с комментариями, CDATA, IGNORE и насколько нужно отличать <any html tag> от <some non-html tag>?
Re[3]: самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 04.02.13 10:42
Оценка:
например документ может быть таким

<font ...> ... plain text ... </font> ...plain text ... <img ...> ... plain text ... <br>

на выходе должен быть только ...plain text...
Re[2]: самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 04.02.13 10:45
Оценка:
Здравствуйте, samius, Вы писали:

S>А что с комментариями, CDATA, IGNORE и насколько нужно отличать <any html tag> от <some non-html tag>?


комментариев нет ... теги различать не надо ...

нужно удалить все что между <...> и сами <> разумеется ...

единственное что тег <br> нужно не просто удалить а заменить его на перевод строки \r\n
Re[3]: самый быстрый способ удалить все <any html tag>
От: samius Япония http://sams-tricks.blogspot.com
Дата: 04.02.13 10:47
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>Здравствуйте, samius, Вы писали:


S>>А что с комментариями, CDATA, IGNORE и насколько нужно отличать <any html tag> от <some non-html tag>?


J>комментариев нет ... теги различать не надо ...


J>нужно удалить все что между <...> и сами <> разумеется ...


J>единственное что тег <br> нужно не просто удалить а заменить его на перевод строки \r\n

Раз такая пьянка, то в <div>, <p> и прочих блочных тегах надо перевод строки?
Re[3]: самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 04.02.13 10:49
Оценка:
в тексте знаки < > в голом виде встретиться не могут так как это html документ так что если видим < > то это точно тег который надо удалить ...
Re[4]: самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 04.02.13 10:52
Оценка:
Здравствуйте, samius, Вы писали:

S>Раз такая пьянка, то в <div>, <p> и прочих блочных тегах надо перевод строки?


а таких тегов в документе точно нет ... подставлять \r\n надо только для <br>
Re[4]: самый быстрый способ удалить все <any html tag>
От: samius Япония http://sams-tricks.blogspot.com
Дата: 04.02.13 11:02
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:


J>в тексте знаки < > в голом виде встретиться не могут так как это html документ


Это ведь неправда
<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
  <head>
    <title>T</title>
  </head>
<body>
 >
</body>
</html>

This document was successfully checked as HTML 2.0!
Re[5]: самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 04.02.13 11:14
Оценка:
Здравствуйте, samius, Вы писали:

J>>в тексте знаки < > в голом виде встретиться не могут так как это html документ


S>Это ведь неправда


правда ... этот html генерирую я ...
Re[6]: самый быстрый способ удалить все <any html tag>
От: samius Япония http://sams-tricks.blogspot.com
Дата: 04.02.13 11:16
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

S>>Это ведь неправда


J>правда ... этот html генерирую я ...

Т.е. это частный случай.
Тогда может проще сгенерировать его без тегов?
Re[7]: самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 04.02.13 11:25
Оценка:
Здравствуйте, samius, Вы писали:

S>Т.е. это частный случай.

S>Тогда может проще сгенерировать его без тегов?

без тегов не могу ... он должен рендериться браузером ...

просто в какой то момент мне надо скопировать весь текст из окна ...

так вот стандартная команда Document->ExecCommand(Copy) ужасно медленная ...
Re[8]: самый быстрый способ удалить все <any html tag>
От: samius Япония http://sams-tricks.blogspot.com
Дата: 04.02.13 11:38
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>Здравствуйте, samius, Вы писали:


J>так вот стандартная команда Document->ExecCommand(Copy) ужасно медленная ...

Еще бы! Полагаю что она делает кучу работы.

Вобщем, раз формат документа таки свой (без комментов, CDATA и т.п.), то быстрее цикла вряд ли что можно придумать. Особенно, учитывая character-reference-ы.

Для начала я бы сделал 2 забега. Первый — подсчет длины текста, конвертация char-ref-ов и обнуление всего лишнего. Второй — сбор данных в финальный буфер.
Re[6]: самый быстрый способ удалить все <any html tag>
От: DeafCoder  
Дата: 04.02.13 11:49
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>правда ... этот html генерирую я ...


Лучше тогда сгенерить плаин текст и положить его в hidden поле html-я.
Re[3]: самый быстрый способ удалить все <any html tag>
От: MTD https://github.com/mtrempoltsev
Дата: 04.02.13 12:00
Оценка: +1
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>>Если этот тег не встречается больше нигде, то регэкспом, вестимо.


J>ой что то я не уверен ...


На тебе самую быструю реализацию: http://codepad.org/HY9L7D8I (без обработки ошибок), только string заменишь на столь горячо любимые тобой голые узатели.

J>просто это команда в гуи и она должна мгновенно выдавать результат ...


А вот так приличные люди не делают — если операция может занять длительное время, нужно выводить диалог с прогресс баром, а не расчитывать на малый объем данных/голые указатели
Re: самый быстрый способ удалить все <any html tag>
От: enji  
Дата: 04.02.13 13:14
Оценка: 1 (1)
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>какой самый быстрый способ удалить все <any html tag> ?


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

Ну и на крайний случай — как тут уже написали — ходишь по тексту самостоятельно
Re: самый быстрый способ удалить все <any html tag>
От: c-smile Канада http://terrainformatica.com
Дата: 04.02.13 17:37
Оценка: 1 (1)
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>какой самый быстрый способ удалить все <any html tag> ?


Это самый быстрый точно:
http://www.codeproject.com/Articles/14076/Fast-and-Compact-HTML-XML-Scanner-Tokenizer
Re[2]: самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 04.02.13 19:49
Оценка:
всех благодарю, буду что нибудь пробовать
Re[4]: самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 04.02.13 23:25
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>На тебе самую быструю реализацию: http://codepad.org/HY9L7D8I (без обработки ошибок), только string заменишь на столь горячо любимые тобой голые узатели.


Вы ошибаетесь меня тошнит от велосипедостроения ... но нужда заставила

J>>просто это команда в гуи и она должна мгновенно выдавать результат ...


MTD>А вот так приличные люди не делают — если операция может занять длительное время, нужно выводить диалог с прогресс баром, а не расчитывать на малый объем данных/голые указатели


это да если не добъюсь приемлемой скорости не слишком большими силами то сделаю прогресс бар
Re[3]: самый быстрый способ удалить все <any html tag>
От: jazzer Россия Skype: enerjazzer
Дата: 05.02.13 01:21
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>Здравствуйте, jazzer, Вы писали:


J>>Если этот тег не встречается больше нигде, то регэкспом, вестимо.


J>ой что то я не уверен ...


J>помните первую тему про регулярки мне пришлось переписать все на указателях и

J>заработало фантастически быстро ...

Ну-ну. Удачи с запихиванием any html tag в указатели

J>так что думаю стоит рассматривать только реализацию на голых указателях ...


Хозяин — барин

J>просто это команда в гуи и она должна мгновенно выдавать результат ...


даже с файлом на 5ГБ?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 05.02.13 07:11
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Ну-ну. Удачи с запихиванием any html tag в указатели


у меня мной сгенерированный хтмл поэтому я могу просто искать < > и вырезать их

J>>просто это команда в гуи и она должна мгновенно выдавать результат ...


J>даже с файлом на 5ГБ?


таких файлов не может быть думаю максимум до 100 мб
Re[5]: самый быстрый способ удалить все <any html tag>
От: jazzer Россия Skype: enerjazzer
Дата: 05.02.13 07:24
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>у меня мной сгенерированный хтмл поэтому я могу просто искать < > и вырезать их


Т.е. тебе надо вырезать не html-теги, а просто текст между угловыми скобками?
Тогда на указателях проще всего, и пишется в три строчки: копируешь все до открывающей скобки, потом ищешь закрывающую, потом идешь обратно на шаг 1.

J>>>просто это команда в гуи и она должна мгновенно выдавать результат ...


J>>даже с файлом на 5ГБ?


J>таких файлов не может быть думаю максимум до 100 мб

и куда оно в гуй выдаст 100-метровый результат?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 05.02.13 07:41
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Т.е. тебе надо вырезать не html-теги, а просто текст между угловыми скобками?

J>Тогда на указателях проще всего, и пишется в три строчки: копируешь все до открывающей скобки, потом ищешь закрывающую, потом идешь обратно на шаг 1.

ну я примерно такой код и набросал вот он но это пока черновик

void fast_remove_tags(const std::wstring& text, std::wstring& ret)
{
    PСWSTR p = text.c_str(), q;
    PCWSTR hdr = L"<DIV class=ST>";
    p = wcsstr(p, hdr);
    p += wcslen(hdr);
    while (*p)
    {
        q = wcschr(p, L'<');
        if (!q)
        {
            break;
        }
        if (q - p)
        {
            ret.append(p, q - p);
        }
        if (q[1] == L'B' && q[2] == L'R' && q[3] == L'>')
        {
            ret.append(L"\r\n");
        }
        p = wcschr(q, L'>') + 1;
    }
}


возможно лучше заменить wcschr на цикл ? профайлер еще не натравливал на этот код ...

J>>>>просто это команда в гуи и она должна мгновенно выдавать результат ...


J>>>даже с файлом на 5ГБ?


J>>таких файлов не может быть думаю максимум до 100 мб

J>и куда оно в гуй выдаст 100-метровый результат?

ну это я тоже преувеличил думаю реально 3 мб где то ...
Re[6]: самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 05.02.13 07:43
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Т.е. тебе надо вырезать не html-теги, а просто текст между угловыми скобками?


только не между а включая ...
Re[6]: самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 05.02.13 11:39
Оценка:
Здравствуйте, jazzer, Вы писали:

J>и куда оно в гуй выдаст 100-метровый результат?


а вообще это не в гуй надо а в буфер обмена
Re[3]: самый быстрый способ удалить все <any html tag>
От: Кодт Россия  
Дата: 05.02.13 20:16
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>единственное что тег <br> нужно не просто удалить а заменить его на перевод строки \r\n


Ага, а как насчёт превращения всяких &entity; и &#nnn; в соответствующие символы?
По крайней мере, &lt;, &gt;, &amp; точно.
Перекуём баги на фичи!
Re[4]: самый быстрый способ удалить все <any html tag>
От: jyuyjiyuijyu  
Дата: 05.02.13 20:38
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Ага, а как насчёт превращения всяких &entity; и &#nnn; в соответствующие символы?

К>По крайней мере, &lt;, &gt;, &amp; точно.

у меня же смешанная сборка натив + менеджед я юзаю HttpUtility::HtmlDecode

#pragma unmanaged

void fast_remove_tags(const std::wstring& text, std::wstring& ret)
{
   ...
}

#pragma managed

std::wstring d = marshal_as<std::wstring>(webBrowser1->DocumentText);
std::wstring ret;
fast_remove_tags(d, ret);
if (ret.size())
{
    Clipboard::SetText(Web::HttpUtility::HtmlDecode(marshal_as<String^>(ret)));
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.