Здравствуйте, jyuyjiyuijyu, Вы писали:
J>Всем привет
J>существует огромный документ такого вида
J><any html tag> ... plain text ... <any html tag>
J>хранится он в std::wstring ...
J>какой самый быстрый способ удалить все <any html tag> ?
Если этот тег не встречается больше нигде, то регэкспом, вестимо.
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>какой самый быстрый способ удалить все <any html tag> ?
А что с комментариями, CDATA, IGNORE и насколько нужно отличать <any html tag> от <some non-html tag>?
Re[3]: самый быстрый способ удалить все <any html tag>
Здравствуйте, 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, Вы писали:
S>>Это ведь неправда
J>правда ... этот html генерирую я ...
Т.е. это частный случай.
Тогда может проще сгенерировать его без тегов?
Re[7]: самый быстрый способ удалить все <any html tag>
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>Здравствуйте, samius, Вы писали:
J>так вот стандартная команда Document->ExecCommand(Copy) ужасно медленная ...
Еще бы! Полагаю что она делает кучу работы.
Вобщем, раз формат документа таки свой (без комментов, CDATA и т.п.), то быстрее цикла вряд ли что можно придумать. Особенно, учитывая character-reference-ы.
Для начала я бы сделал 2 забега. Первый — подсчет длины текста, конвертация char-ref-ов и обнуление всего лишнего. Второй — сбор данных в финальный буфер.
Re[6]: самый быстрый способ удалить все <any html tag>
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>>Если этот тег не встречается больше нигде, то регэкспом, вестимо.
J>ой что то я не уверен ...
На тебе самую быструю реализацию: http://codepad.org/HY9L7D8I (без обработки ошибок), только string заменишь на столь горячо любимые тобой голые узатели.
J>просто это команда в гуи и она должна мгновенно выдавать результат ...
А вот так приличные люди не делают — если операция может занять длительное время, нужно выводить диалог с прогресс баром, а не расчитывать на малый объем данных/голые указатели
Re: самый быстрый способ удалить все <any html tag>
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>какой самый быстрый способ удалить все <any html tag> ?
Я бы все же начал с обычных регулярок.
Если не хватает их быстродействия — попадалась как-то тулза, которая "компилировала" регулярку в сишную программу.
Ну и на крайний случай — как тут уже написали — ходишь по тексту самостоятельно
Re: самый быстрый способ удалить все <any html tag>
Здравствуйте, MTD, Вы писали:
MTD>На тебе самую быструю реализацию: http://codepad.org/HY9L7D8I (без обработки ошибок), только string заменишь на столь горячо любимые тобой голые узатели.
Вы ошибаетесь меня тошнит от велосипедостроения ... но нужда заставила
J>>просто это команда в гуи и она должна мгновенно выдавать результат ...
MTD>А вот так приличные люди не делают — если операция может занять длительное время, нужно выводить диалог с прогресс баром, а не расчитывать на малый объем данных/голые указатели
это да если не добъюсь приемлемой скорости не слишком большими силами то сделаю прогресс бар
Re[3]: самый быстрый способ удалить все <any html tag>
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>Здравствуйте, jazzer, Вы писали:
J>>Если этот тег не встречается больше нигде, то регэкспом, вестимо.
J>ой что то я не уверен ...
J>помните первую тему про регулярки мне пришлось переписать все на указателях и J>заработало фантастически быстро ...
Ну-ну. Удачи с запихиванием any html tag в указатели
J>так что думаю стоит рассматривать только реализацию на голых указателях ...
Хозяин — барин
J>просто это команда в гуи и она должна мгновенно выдавать результат ...
Здравствуйте, jazzer, Вы писали:
J>Ну-ну. Удачи с запихиванием any html tag в указатели
у меня мной сгенерированный хтмл поэтому я могу просто искать < > и вырезать их
J>>просто это команда в гуи и она должна мгновенно выдавать результат ...
J>даже с файлом на 5ГБ?
таких файлов не может быть думаю максимум до 100 мб
Re[5]: самый быстрый способ удалить все <any html tag>
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>у меня мной сгенерированный хтмл поэтому я могу просто искать < > и вырезать их
Т.е. тебе надо вырезать не html-теги, а просто текст между угловыми скобками?
Тогда на указателях проще всего, и пишется в три строчки: копируешь все до открывающей скобки, потом ищешь закрывающую, потом идешь обратно на шаг 1.
J>>>просто это команда в гуи и она должна мгновенно выдавать результат ...
J>>даже с файлом на 5ГБ?
J>таких файлов не может быть думаю максимум до 100 мб
и куда оно в гуй выдаст 100-метровый результат?
Здравствуйте, 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>
Здравствуйте, Кодт, Вы писали:
К>Ага, а как насчёт превращения всяких &entity; и &#nnn; в соответствующие символы? К>По крайней мере, <, >, & точно.
у меня же смешанная сборка натив + менеджед я юзаю HttpUtility::HtmlDecode