Romul81
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Abs62 По поводу оптимизации блока filterResource mdx-модуля. Я, конечно не ахти как во всём этом разбираюсь (в плане методов Qt и их эффективности), но мне кажется, что в плане логики обработки неэффективность заключается в том, что вся статья неоднократно "шерстится" регулярками. Именно вся статья (которые в Mdict могут быть очень большими). Проблема не только и не столько в самих регулярках, а в логике обработки. Хотел бы предложить несколько другой подход. Уверен, Вы в курсе, что в Qt существует класс QStringList. Так вот, идея в том, чтоб по стрингу article проходить только один раз регуляркой, например такой: Код: (<\s*(a(?:rea)?|link|script|img)\s+[^>]*>) | (в жадном варианте), захватывая все совпадения в list. При том, вторая группа захватывает сам тег, что может использоваться для последующего теста при итерации. Далее, этот лист итерируется и обрабатывается по switch case, к примеру (в зависимости от 2-й группы-тега). Т.е. регулярки проверяются уже только на соответствие элементам листа. Не знаю, какой метод здесь лучше применять - Вам виднее, но в классе есть всё необходимое для этого - filter(const QRegExp & rx) const, replaceInStrings(const QRegExp & rx, const QString & after) и т.д. Итерацию можно было бы делать от конца к началу, делая замены по pos, чтоб позиция не сбивалась - ну это так, пальцем в небо, может есть более простые решения. Думаю, основная идея понятна. Если напишете каркас блока, я бы мог подсобить с регулярками (чем могу, как говорится)). Если опыт окажется удачным, то можно перенести ту же логику в другие модули. За скобками остались вопросы, касающиеся внутренней кухни Qt - что по факту работает быстрее? Стоит ли подгружать новый класс из-за этого? На сколько быст switch case? Может есть другой способ захватить в массив все вхождения за один проход и итерировать подобным образом?.. Тут нужен неслабый практический опыт программирования под Qt... В общем, Вам виднее. З.Ы. А что касается вот этого, то это, конечно же, костыль, решающий одну частную ситуацию. В содержимое <script></script> вообще лезть не надо. Для этого нужно вообще исключить паттерн <script>.*</script> (в нежадном варианте) из обработки (по индексу или ещё как-то). |