Что нового

[RegExp] Объединение похожих стилей

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Имеем строку:
Код:
<span class="S5">If</span> <span class="S13">(</span><span class="S9">$iYears</span> <span class="S13">></span><span class="S13">=</span> <span class="S3">20</span> <span class="S5">And</span> <span class="S4">StringRight</span><span class="S13">(</span><span class="S9">$iYears</span><span class="S13">,</span> <span class="S3">1</span><span class="S13">)</span> <span class="S13">=</span><span class="S13">=</span> <span class="S3">2</span><span class="S13">)</span> <span class="S5">Or</span> <span class="S13">(</span><span class="S9">$iYears</span> <span class="S13"><</span>

Нужно получить следующее:
Код:
<span class="S5">If</span> <span class="S13">(</span><span class="S9">$iYears</span> <span class="S13">>=</span> <span class="S3">20</span> <span class="S5">And</span> <span class="S4">StringRight</span><span class="S13">(</span><span class="S9">$iYears</span><span class="S13">,</span> <span class="S3">1</span><span class="S13">) ==</span> <span class="S3">2</span><span class="S13">)</span> <span class="S5">Or</span> <span class="S13">(</span><span class="S9">$iYears</span> <span class="S13"><</span>

Т.е нужно заменить в строке такое совпадение:
Код:
<span class="S13">></span><span class="S13">=</span>

на это:
Код:
<span class="S13">>=</span>
если ещё точнее, то нужно убрать идущие подряд одинаковые стили, в этом случае стиль S13 повторяется два раза, поэтому один стиль нужно удалить.

Могут встречаться и такие стили:
Код:
<span class="S13">></span> <span class="S13">=</span>

и тогда добавленный пробел должен учитываться при удалении, он должен попасть между двумя символами:
Код:
<span class="S13">> =</span>

Я пробовал по всякому, вот примерно так:

Код:
$vTest = StringRegExpReplace($sLine, '(?si)<span class="S(\d+)">([^(?:</?span)]*)</span><span class="S\1">(.*?)</span>', '<span class="S\1">\2\3\4</span>')


но оно не полностью заменяет :(.

Есть идеи у кого?
 

amel27

Продвинутый
Сообщения
146
Репутация
55
хде-то так:

Код:
StringRegExpReplace($sLine, '(?i)(?<=(<span class="S\d">))(?>(.*?)</span>)( *)\1|(?<=(<span class="S\d\d">))(?>(.*?)</span>)( *)\4', '\2\3\5\6')
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Мда, сразу чувствуется, тут был спец. по регулярным выражениям! :laugh:

Супер, спасибо!

P.S
У меня лично получилось(?) двумя заходами:

Код:
$sLine = StringRegExpReplace($sLine, '(?i)(<span class="S(\d+)">)([^(?:</?span)]*)(</span>)<span class="S\2">(.*?)</span>', '\1\3\5\4')
$sLine = StringRegExpReplace($sLine, '(?i)(<span class="S(\d+)">)([^</]*)(</span>)(\s+)<span class="S\2">(.*?)</span>', '\1\3\5\6\4')



Добавлено:
Сообщение автоматически объединено:

Если кому то интересно зачем оно мне надо, скажу следующее: Я пишу собственный парсер для раскраски синтаксиса кода на AutoIt, парсер в принципе готов, вот только бы оптимизировать его рег. выражения, которые надо заметить, работают медленнее чем хотелось бы :(...
 

amel27

Продвинутый
Сообщения
146
Репутация
55
CreatoR сказал(а):
У меня лично получилось(?) двумя заходами
если заметил, у меня тоже два искусственно объединенных выражения - для одно-/двухзначных номеров стилей
...если подумать, то можно их слить в одно:

Код:
StringRegExpReplace($s,'(?i)(?<=(<span class="S))(?>((\d++)">.*?)</span>)( *+)\1\3">','\2\4')


"слабое звено" в твоём варианте: "[^(?:</?span)]*" и "[^</]*" :whistle:

CreatoR сказал(а):
пишу собственный парсер для раскраски синтаксиса кода на AutoIt
гм... тогда откуда сами эти стили?

CreatoR сказал(а):
вот только бы оптимизировать его рег. выражения, которые надо заметить, работают медленнее чем хотелось бы
ну если ты возьмешь на себя труд оформить регекспы с комментами, как в этом топике, готов подключиться к обсуждению по мере возможности ;)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
amel27 [?]
если подумать, то можно их слить в одно
А оно не будет в ущерб скорости?

тогда откуда сами эти стили?
Я их написал для конечного html, это будут CSS-стили.

если ты возьмешь на себя труд оформить регекспы с комментами, как в этом топике, готов подключиться к обсуждению по мере возможности
Супер!
У меня уже в принципе всё готово, коменты везде есть (правда на английском), я буду рад если поможешь оптимизировать, особенно RegExp'сы на предмет ускорения :smile:

Позже буду выкладывать в примерах, ещё бы правда это решить :whistle:...
 

amel27

Продвинутый
Сообщения
146
Репутация
55
CreatoR сказал(а):
А оно не будет в ущерб скорости?
тест показал, что последний вариант получился в 1,5-2 раза быстрее

CreatoR сказал(а):
тогда откуда сами эти стили?
Я их написал для конечного html, это будут CSS-стили.
я не силен в веб-технологиях, поэтому (если не сложно) объясни в двух словах: что к чему прикручивается, а главное - причем тут AutoIT?.. :wacko:

CreatoR сказал(а):
У меня уже в принципе всё готово, коменты везде есть (правда на английском)
хорошо бы в форме: одна задача -> один топик, и само собой, на русском :smile:

CreatoR сказал(а):
ещё бы правда это решить
ок, гляну
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
amel27 [?]
объясни в двух словах: что к чему прикручивается, а главное - причем тут AutoIT?
Ну как, autoit генерирует html-код (подсветка синтаксиса), и в процессе гененрации каждому тегу присваивается некий класс (свойство/поведение тега), этот класс, а точнее все нужные классы (от 1 до 15-ти) позже будут добавлены в файл каскадных таблиц стилей (что называется CSS), и сгенерированный html-код будет считывать эти стили, и соотв-енно выводить код с подсвеченным синтаксисом. Я добавил также поддержку конвертирования в BBCode, вот там уже никакие стили не используются, просто значения стилей конвертируются в теги BB-кода.

хорошо бы в форме: одна задача -> один топик, и само собой, на русском
Не уверен что поонял, но это будет одна тема, а точнее один проект :smile:. Я вот вот добавляю систему отладки регулярных выражении, где в консоль будут выводиться все шаблоны, плюс комены к ним.
 

amel27

Продвинутый
Сообщения
146
Репутация
55
CreatoR сказал(а):
Не уверен что понял, но это будет одна тема, а точнее один проект

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