Преобразование html в bb-code
UIYOYXB Дата: Ср, 28 Января 2015, 00:18 | Сообщение # 1
Возникла необходимость в преобразовании html тегов в bb-code, и возникла трудность с преобразованием html в bb-code следующих html тегов, а именно: Код
<span style="font-size:14pt;">Размер шрифта</span> <span style="font-family:Arial">Ариал</span> <span style="color:#1155cc">Цвет текста</span>
В принципе я могу их преобразовывать, но только если внутри их нет другого из перечисленных выше тегов, если есть то тогда идет неправильное закрытие bb-code, то есть если они идут один внутри другого, то должны закрываться так: Код
<span style="font-size:14pt;"><span style="font-family:Arial"><span style="color:#1155cc">Текст</span></span></span> [size=14pt][font=Arial][color=#1155cc]Текст[/color][/font][/size]
А у меня получается только так: Код
[size=14pt][font=Arial][color=#1155cc]Текст[/size][/font][/color]
и вот на этом моменте уже не одну банку кофе выпил но решение как то не наклевывается, есть ли у кого нибудь мысли по поводу того как сделать это более правильно? Исходник в архиве
Сообщение отредактировано UIYOYXB - Ср, 28 Января 2015, 00:19
Сообщение Возникла необходимость в преобразовании html тегов в bb-code, и возникла трудность с преобразованием html в bb-code следующих html тегов, а именно: Код
<span style="font-size:14pt;">Размер шрифта</span> <span style="font-family:Arial">Ариал</span> <span style="color:#1155cc">Цвет текста</span>
В принципе я могу их преобразовывать, но только если внутри их нет другого из перечисленных выше тегов, если есть то тогда идет неправильное закрытие bb-code, то есть если они идут один внутри другого, то должны закрываться так: Код
<span style="font-size:14pt;"><span style="font-family:Arial"><span style="color:#1155cc">Текст</span></span></span> [size=14pt][font=Arial][color=#1155cc]Текст[/color][/font][/size]
А у меня получается только так: Код
[size=14pt][font=Arial][color=#1155cc]Текст[/size][/font][/color]
и вот на этом моменте уже не одну банку кофе выпил но решение как то не наклевывается, есть ли у кого нибудь мысли по поводу того как сделать это более правильно? Исходник в архиве Автор - UIYOYXB Дата добавления - 28 Января 2015 в 00:18
Callisto Дата: Ср, 28 Января 2015, 03:24 | Сообщение # 2
На работе скучно, т.ч. немного поэкспериментировала Мой вариант Добавлено (28 Января 2015, 03:24) --------------------------------------------- Хотя, мне кажется, лучше использовать регулярные выражения, но в НБ у меня с ними не заладилось
Пожалуйста, не надо ко мне на "Вы", а то чувствую себя бабулькой)
Сообщение отредактировано Callisto - Ср, 28 Января 2015, 03:23
DEMBEL Дата: Ср, 28 Января 2015, 09:27 | Сообщение # 3
В данном конкретном случае, когда нет текста между тегами, разве есть разница в порядке закрытия тегов? Работает же и так.
Как задавать вопросы Win7x64 SP1 Neobook v5.70 (Trial) WinXP SP3 Neobook v5.62
Сообщение В данном конкретном случае, когда нет текста между тегами, разве есть разница в порядке закрытия тегов? Работает же и так. Автор - DEMBEL Дата добавления - 28 Января 2015 в 09:27
UIYOYXB Дата: Ср, 28 Января 2015, 18:59 | Сообщение # 4
Цитата Callisto (
)
На работе скучно, т.ч. немного поэкспериментировала
Спасибо за пример, к сожалению он тоже работает не так как нужно, например если между тегами еще будет информация (например человек сделал большой размер, а внутри одно слово сделал скажем синего цвета, а для другого цвета указал другой шрифт, например так: Код
<span style="font-size:14pt;">Это просто большой текст и дальше за ним тоже большой текст <span style="color:#1155cc">а это текст другого цвета</span><span style="font-family:Arial">а это текст другим шрифтом</span></span>
То парсит немного не так как надо Тем не менее меня Ваш пример натолкнул на одну мысль, сейчас буду пробовать ее реализовать, если все получится то поделюсь решением Цитата Callisto (
)
Хотя, мне кажется, лучше использовать регулярные выражения, но в НБ у меня с ними не заладилось
А разве в НБ можно использовать регулярные выражения, вроде по стандарту таких функций нет, и вроде плагина я тоже не видел, если он есть прошу кинуть ссылку Цитата DEMBEL (
)
В данном конкретном случае, когда нет текста между тегами, разве есть разница в порядке закрытия тегов? Работает же и так.
Ну он может быть, тот пример что я показал это только для примера. А сам текст может выглядеть и так как я привел в этом сообщении, и вот тогда критично неправильное закрытие bb-code
Сообщение отредактировано UIYOYXB - Ср, 28 Января 2015, 19:02
Сообщение Цитата Callisto (
)
На работе скучно, т.ч. немного поэкспериментировала
Спасибо за пример, к сожалению он тоже работает не так как нужно, например если между тегами еще будет информация (например человек сделал большой размер, а внутри одно слово сделал скажем синего цвета, а для другого цвета указал другой шрифт, например так: Код
<span style="font-size:14pt;">Это просто большой текст и дальше за ним тоже большой текст <span style="color:#1155cc">а это текст другого цвета</span><span style="font-family:Arial">а это текст другим шрифтом</span></span>
То парсит немного не так как надо Тем не менее меня Ваш пример натолкнул на одну мысль, сейчас буду пробовать ее реализовать, если все получится то поделюсь решением Цитата Callisto (
)
Хотя, мне кажется, лучше использовать регулярные выражения, но в НБ у меня с ними не заладилось
А разве в НБ можно использовать регулярные выражения, вроде по стандарту таких функций нет, и вроде плагина я тоже не видел, если он есть прошу кинуть ссылку Цитата DEMBEL (
)
В данном конкретном случае, когда нет текста между тегами, разве есть разница в порядке закрытия тегов? Работает же и так.
Ну он может быть, тот пример что я показал это только для примера. А сам текст может выглядеть и так как я привел в этом сообщении, и вот тогда критично неправильное закрытие bb-code Автор - UIYOYXB Дата добавления - 28 Января 2015 в 18:59
Callisto Дата: Ср, 28 Января 2015, 20:32 | Сообщение # 5
Цитата UIYOYXB (
)
если он есть прошу кинуть ссылку
hpwControl Цитата UIYOYXB (
)
например если между тегами еще будет информация
Ну, я исходила из примера, просто я HTML плохо знаю, чтоб предусмотреть все
Пожалуйста, не надо ко мне на "Вы", а то чувствую себя бабулькой)
Сообщение Цитата UIYOYXB (
)
если он есть прошу кинуть ссылку
hpwControl Цитата UIYOYXB (
)
например если между тегами еще будет информация
Ну, я исходила из примера, просто я HTML плохо знаю, чтоб предусмотреть все Автор - Callisto Дата добавления - 28 Января 2015 в 20:32
mishem Дата: Ср, 28 Января 2015, 21:49 | Сообщение # 6
Цитата Callisto (
)
просто я HTML плохо знаю, чтоб предусмотреть все
Где то я читал, что это большая глупость пытаться парсить теги кода html, а уж тем более регуляркой. Можно это сделать по предварительному шаблону, типа какого нибудь сайта, но сделать что то универсальное, НЕ ВОЗМОЖНО.
Не хочешь читать хелп? Если хелп и форум не помогли, тогда все ответы здесь Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
Сообщение Цитата Callisto (
)
просто я HTML плохо знаю, чтоб предусмотреть все
Где то я читал, что это большая глупость пытаться парсить теги кода html, а уж тем более регуляркой. Можно это сделать по предварительному шаблону, типа какого нибудь сайта, но сделать что то универсальное, НЕ ВОЗМОЖНО.Автор - mishem Дата добавления - 28 Января 2015 в 21:49
Сообщение Вообщем удалось достигнуть некоторых результатов Тем не менее опять не совсем то что нужно, при определенных обстоятельствах bb-code могут закрываться неправильно (так как поиск и их замена происходит рекурсивно внутри первого искомого html тега, а так как "выловить" позицию тега который его закрывает непонятно как, то может произойти замена тегов которые мы ищем внутри открытого тега в другой части документа не принадлежащей к тегу который мы проверяем на предмет вложенных тегов, и тогда может пойти неправильное закрытие bb-code как то в общем так). Таким образом вопрос как это распарсить и преобразовать остается открытым Автор - UIYOYXB Дата добавления - 29 Января 2015 в 00:43
Callisto Дата: Чт, 29 Января 2015, 02:47 | Сообщение # 8
Цитата mishem (
)
но сделать что то универсальное, НЕ ВОЗМОЖНО.
Можно написать свой ИИ Цитата UIYOYXB (
)
вопрос как это распарсить и преобразовать остается открытым
Есть мысль, но проверить пока не могу. Надо брать первый тег и смотреть что идет за ним, если следующий тег, то отбрасывать первый и работать со вторым, если текст, то смотреть, что идет после текста, если завершающий тег, то уже обработать этот участок строки и начать сначала. Если опять идет тег, то отбрасываем все что идет до него и опять возвращаемся к начальному действию. Но тут нужна одна одна фишка, поиск в строке с определенной позиции (в Lua есть такое), в НБ можно реализовать функцией. Мыслей много, но проверить пока не могу
Пожалуйста, не надо ко мне на "Вы", а то чувствую себя бабулькой)
Сообщение Цитата mishem (
)
но сделать что то универсальное, НЕ ВОЗМОЖНО.
Можно написать свой ИИ Цитата UIYOYXB (
)
вопрос как это распарсить и преобразовать остается открытым
Есть мысль, но проверить пока не могу. Надо брать первый тег и смотреть что идет за ним, если следующий тег, то отбрасывать первый и работать со вторым, если текст, то смотреть, что идет после текста, если завершающий тег, то уже обработать этот участок строки и начать сначала. Если опять идет тег, то отбрасываем все что идет до него и опять возвращаемся к начальному действию. Но тут нужна одна одна фишка, поиск в строке с определенной позиции (в Lua есть такое), в НБ можно реализовать функцией. Мыслей много, но проверить пока не могу Автор - Callisto Дата добавления - 29 Января 2015 в 02:47
DEMBEL Дата: Чт, 29 Января 2015, 10:51 | Сообщение # 9
Ого, Callisto уже близка к разгадке ) Есс-но, разбирать эту матрешку тегов нужно в обратном её созданию порядке, и полагать что тогда первый попавшийся закрывающий тег будет принадлежать тому, который разбираем. Ну и так проходить строку несколько раз подряд по кол-ву тегов, но сперва проверить, равно ли кол-во открывающих тегов кол-ву закрывающих, если что добавлять или выкидывать ошибку.Добавлено (29 Января 2015, 10:51) --------------------------------------------- а лучше на js все это написать регулярками, есть же примеры конвертеров в сети вроде
Как задавать вопросы Win7x64 SP1 Neobook v5.70 (Trial) WinXP SP3 Neobook v5.62
Сообщение Ого, Callisto уже близка к разгадке ) Есс-но, разбирать эту матрешку тегов нужно в обратном её созданию порядке, и полагать что тогда первый попавшийся закрывающий тег будет принадлежать тому, который разбираем. Ну и так проходить строку несколько раз подряд по кол-ву тегов, но сперва проверить, равно ли кол-во открывающих тегов кол-ву закрывающих, если что добавлять или выкидывать ошибку.Добавлено (29 Января 2015, 10:51) --------------------------------------------- а лучше на js все это написать регулярками, есть же примеры конвертеров в сети вроде
Автор - DEMBEL Дата добавления - 29 Января 2015 в 10:51
UIYOYXB Дата: Чт, 29 Января 2015, 19:01 | Сообщение # 10
Цитата Callisto (
)
Есть мысль, но проверить пока не могу.
Надо брать первый тег и смотреть что идет за ним, если следующий тег, то отбрасывать первый и работать со вторым, если текст, то смотреть, что идет после текста, если завершающий тег, то уже обработать этот участок строки и начать сначала. Если опять идет тег, то отбрасываем все что идет до него и опять возвращаемся к начальному действию.
Но тут нужна одна одна фишка, поиск в строке с определенной позиции (в Lua есть такое), в НБ можно реализовать функцией.
Мыслей много, но проверить пока не могу
Цитата DEMBEL (
)
Ого, Callisto уже близка к разгадке ) Есс-но, разбирать эту матрешку тегов нужно в обратном её созданию порядке, и полагать что тогда первый попавшийся закрывающий тег будет принадлежать тому, который разбираем. Ну и так проходить строку несколько раз подряд по кол-ву тегов, но сперва проверить, равно ли кол-во открывающих тегов кол-ву закрывающих, если что добавлять или выкидывать ошибку.
Примерно так и работает код, и он бы работал на 100% правильно если бы можно было определить границу тега внутри которого находятся вложенные теги, а так как границу тега который имеет вложенные теги непонятно как определить, то во время рекурсивной замены вложенных тегов в первый тег может рекурсивно заменить теги и по всей строке что в итоге может вызвать неправильное закрытие bb-code Цитата DEMBEL (
)
а лучше на js все это написать регулярками, есть же примеры конвертеров в сети вроде
Ну надо все реализовать на НБ, к тому же вчера Гуглил вопрос и везде натыкался на то что у людей были сложности с определением границами тега который закрывает тег который имеет вложенные теги. Насколько я понял нужно создавать дерево документа найдя сначала все позиции открывающих тегов, а потом найти позиции все закрывающих тегов, а потом уже в зависимости от последовательности расположения открывающих тегов преобразовывать закрывающие теги, как то так. В принципе идея реализуемая но очень сложно реализуемая, или я что то не понял и все это можно реализовать очень просто
Сообщение Цитата Callisto (
)
Есть мысль, но проверить пока не могу.
Надо брать первый тег и смотреть что идет за ним, если следующий тег, то отбрасывать первый и работать со вторым, если текст, то смотреть, что идет после текста, если завершающий тег, то уже обработать этот участок строки и начать сначала. Если опять идет тег, то отбрасываем все что идет до него и опять возвращаемся к начальному действию.
Но тут нужна одна одна фишка, поиск в строке с определенной позиции (в Lua есть такое), в НБ можно реализовать функцией.
Мыслей много, но проверить пока не могу
Цитата DEMBEL (
)
Ого, Callisto уже близка к разгадке ) Есс-но, разбирать эту матрешку тегов нужно в обратном её созданию порядке, и полагать что тогда первый попавшийся закрывающий тег будет принадлежать тому, который разбираем. Ну и так проходить строку несколько раз подряд по кол-ву тегов, но сперва проверить, равно ли кол-во открывающих тегов кол-ву закрывающих, если что добавлять или выкидывать ошибку.
Примерно так и работает код, и он бы работал на 100% правильно если бы можно было определить границу тега внутри которого находятся вложенные теги, а так как границу тега который имеет вложенные теги непонятно как определить, то во время рекурсивной замены вложенных тегов в первый тег может рекурсивно заменить теги и по всей строке что в итоге может вызвать неправильное закрытие bb-code Цитата DEMBEL (
)
а лучше на js все это написать регулярками, есть же примеры конвертеров в сети вроде
Ну надо все реализовать на НБ, к тому же вчера Гуглил вопрос и везде натыкался на то что у людей были сложности с определением границами тега который закрывает тег который имеет вложенные теги. Насколько я понял нужно создавать дерево документа найдя сначала все позиции открывающих тегов, а потом найти позиции все закрывающих тегов, а потом уже в зависимости от последовательности расположения открывающих тегов преобразовывать закрывающие теги, как то так. В принципе идея реализуемая но очень сложно реализуемая, или я что то не понял и все это можно реализовать очень просто Автор - UIYOYXB Дата добавления - 29 Января 2015 в 19:01
Сообщение Поспешил выложить. Туго сейчас соображаю. Автор - mishem Дата добавления - 29 Января 2015 в 20:40
Callisto Дата: Чт, 29 Января 2015, 20:46 | Сообщение # 12
Цитата DEMBEL (
)
Ого, Callisto уже близка к разгадке
Интересно, это сарказм или похвала? Цитата UIYOYXB (
)
у людей были сложности с определением границами тега который закрывает тег который имеет вложенные теги
А для этого надо иметь возможность поиска в строке с определенной позиции. Попыталась сделать простенькую функцию, но так, как это моя первая функция, то могла и чуть-чуть напутать, надеюсь корифеи поправят
Код
{NeoBook Function} Version=5,80 Language=NeoBook Param=[%str]|Mixed|Где искать Param=[%pos]|Number|С какой позиции начать Param=[%sf]|Mixed|Что искать Param=[%Var]|Variable|Переменная для сохранения {End} StrLen "[%str]" "[len]" If "[len]" ">" "[%pos]" SubStr "[%str]" "[%pos]" "[len]-[%pos]" "[sstr]" SearchStr "[%sf]" "[sstr]" "[%Var]" "" SetVar "[%Var]" "[%Var]+[%pos]-1" EndIf ClearVariables "[len],[sstr]"
Пожалуйста, не надо ко мне на "Вы", а то чувствую себя бабулькой)
Сообщение Цитата DEMBEL (
)
Ого, Callisto уже близка к разгадке
Интересно, это сарказм или похвала? Цитата UIYOYXB (
)
у людей были сложности с определением границами тега который закрывает тег который имеет вложенные теги
А для этого надо иметь возможность поиска в строке с определенной позиции. Попыталась сделать простенькую функцию, но так, как это моя первая функция, то могла и чуть-чуть напутать, надеюсь корифеи поправят
Код
{NeoBook Function} Version=5,80 Language=NeoBook Param=[%str]|Mixed|Где искать Param=[%pos]|Number|С какой позиции начать Param=[%sf]|Mixed|Что искать Param=[%Var]|Variable|Переменная для сохранения {End} StrLen "[%str]" "[len]" If "[len]" ">" "[%pos]" SubStr "[%str]" "[%pos]" "[len]-[%pos]" "[sstr]" SearchStr "[%sf]" "[sstr]" "[%Var]" "" SetVar "[%Var]" "[%Var]+[%pos]-1" EndIf ClearVariables "[len],[sstr]"
Автор - Callisto Дата добавления - 29 Января 2015 в 20:46
mishem Дата: Чт, 29 Января 2015, 21:47 | Сообщение # 13
Вот так вроде правильно будет
Код
hpwReplaceRegExp "<span style=[#34]font-size:" "[TextEntry1]" "[#91]size=" "" "[TextEntry1]" hpwReplaceRegExp "<span style=[#34]font-family:" "[TextEntry1]" "[#91]font=" "" "[TextEntry1]" hpwReplaceRegExp "<span style=[#34]color:" "[TextEntry1]" "[#91]color=" "" "[TextEntry1]" hpwReplaceRegExp ";[#34]>|[#34]>" "[TextEntry1]" "[#93]" "" "[TextEntry1]" StrParse "[TextEntry1]" "</span>" "[span]" "[Num_span]" Loop "1" "[Num_span]" "[i]" hpwExecRegExpList "size=|font=|color=" "[span[i]]" "[#13]" "[TextEntry2]" StrReplace "[TextEntry2]" "size=" "[#91]/size[#93]" "[TextEntry2]" "" StrReplace "[TextEntry2]" "font=" "[#91]/font[#93]" "[TextEntry2]" "" StrReplace "[TextEntry2]" "color=" "[#91]/color[#93]" "[TextEntry2]" "" hpwLineCount "[TextEntry2]" "[NUM_Line]" If "[NUM_Line]" ">" "0" SetVar "[NUM]" "[NUM_Line]" Loop "1" "[NUM_Line]" "[n]" hpwLine "[TextEntry2]" "[NUM]" "[Line]" SetVar "[span]" "[span][Line]" SetVar "[NUM]" "[NUM]-1" EndLoop EndIf SetVar "[span[i]]" "[span[i]][span]" SetVar "[span]" "" EndLoop hpwStrJoin "[span]" "1" "[Num_span]" "" "[TextEntry1]"
Во всяком случае с тем материалом который предоставлен. Нужен плагин hpwControl
Не хочешь читать хелп? Если хелп и форум не помогли, тогда все ответы здесь Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
Сообщение отредактировано mishem - Пт, 30 Января 2015, 20:43
Сообщение Вот так вроде правильно будет
Код
hpwReplaceRegExp "<span style=[#34]font-size:" "[TextEntry1]" "[#91]size=" "" "[TextEntry1]" hpwReplaceRegExp "<span style=[#34]font-family:" "[TextEntry1]" "[#91]font=" "" "[TextEntry1]" hpwReplaceRegExp "<span style=[#34]color:" "[TextEntry1]" "[#91]color=" "" "[TextEntry1]" hpwReplaceRegExp ";[#34]>|[#34]>" "[TextEntry1]" "[#93]" "" "[TextEntry1]" StrParse "[TextEntry1]" "</span>" "[span]" "[Num_span]" Loop "1" "[Num_span]" "[i]" hpwExecRegExpList "size=|font=|color=" "[span[i]]" "[#13]" "[TextEntry2]" StrReplace "[TextEntry2]" "size=" "[#91]/size[#93]" "[TextEntry2]" "" StrReplace "[TextEntry2]" "font=" "[#91]/font[#93]" "[TextEntry2]" "" StrReplace "[TextEntry2]" "color=" "[#91]/color[#93]" "[TextEntry2]" "" hpwLineCount "[TextEntry2]" "[NUM_Line]" If "[NUM_Line]" ">" "0" SetVar "[NUM]" "[NUM_Line]" Loop "1" "[NUM_Line]" "[n]" hpwLine "[TextEntry2]" "[NUM]" "[Line]" SetVar "[span]" "[span][Line]" SetVar "[NUM]" "[NUM]-1" EndLoop EndIf SetVar "[span[i]]" "[span[i]][span]" SetVar "[span]" "" EndLoop hpwStrJoin "[span]" "1" "[Num_span]" "" "[TextEntry1]"
Во всяком случае с тем материалом который предоставлен. Нужен плагин hpwControl Автор - mishem Дата добавления - 29 Января 2015 в 21:47
UIYOYXB Дата: Чт, 29 Января 2015, 22:30 | Сообщение # 14
Callisto , спасибо mishem , спасибо, но по моему у Вас получилось практически тоже самое что и у меня. Для примера будем парсить и преобразовывать вот это: Код
<span style="font-size:14pt;"><span style="font-family:Arial"><span style="color:#1155cc">Текст</span></span></span> <span style="font-size:14pt;">Размер шрифта</span> <span style="font-family:Arial">Ариал</span> <span style="color:#1155cc">Цвет текста</span> <span style="font-family:Arial">Это просто большой текст и дальше за ним тоже большой текст <span style="color:#1155cc">а это текст другого цвета</span><span style="font-size:14pt;">а это текст другим шрифтом</span></span> <span style="font-size:14pt;">Это просто большой текст и дальше за ним тоже большой текст <span style="color:#1155cc">а это текст другого цвета</span> <span style="font-family:Arial">а это текст другим шрифтом</span></span> <span style="color:#1155cc">Это просто большой текст и дальше за ним тоже большой текст <span style="font-size:14pt;">а это текст другого цвета</span> <span style="font-family:Arial">а это текст другим шрифтом</span></span> <span style="font-size:14pt;">Размер шрифта</span> <span style="font-family:Arial">Ариал</span> <span style="color:#1155cc">Цвет текста</span>
Например парсинг и преобразование Вашим примером к сожалению не преобразовывает так как надо А это парсинг и преобразование моим примером который тоже к сожалению делает это не так как надо
Сообщение Callisto , спасибо mishem , спасибо, но по моему у Вас получилось практически тоже самое что и у меня. Для примера будем парсить и преобразовывать вот это: Код
<span style="font-size:14pt;"><span style="font-family:Arial"><span style="color:#1155cc">Текст</span></span></span> <span style="font-size:14pt;">Размер шрифта</span> <span style="font-family:Arial">Ариал</span> <span style="color:#1155cc">Цвет текста</span> <span style="font-family:Arial">Это просто большой текст и дальше за ним тоже большой текст <span style="color:#1155cc">а это текст другого цвета</span><span style="font-size:14pt;">а это текст другим шрифтом</span></span> <span style="font-size:14pt;">Это просто большой текст и дальше за ним тоже большой текст <span style="color:#1155cc">а это текст другого цвета</span> <span style="font-family:Arial">а это текст другим шрифтом</span></span> <span style="color:#1155cc">Это просто большой текст и дальше за ним тоже большой текст <span style="font-size:14pt;">а это текст другого цвета</span> <span style="font-family:Arial">а это текст другим шрифтом</span></span> <span style="font-size:14pt;">Размер шрифта</span> <span style="font-family:Arial">Ариал</span> <span style="color:#1155cc">Цвет текста</span>
Например парсинг и преобразование Вашим примером к сожалению не преобразовывает так как надо А это парсинг и преобразование моим примером который тоже к сожалению делает это не так как надо Автор - UIYOYXB Дата добавления - 29 Января 2015 в 22:30
mishem Дата: Пт, 30 Января 2015, 00:00 | Сообщение # 15
UIYOYXB , еще раз повторяю, сделать что то универсальное, НЕ ВОЗМОЖНО. Я так понимаю дальше задачи будут усложняться. Предвидеть всех вариантов просто не возможно. Не правильное написание, не правильный синтаксис, ошибки и т.д. Можно взять отдельный участок кода и именно для него что то сделать, пытаться объять не объятное не получится. Добавлено (29 Января 2015, 23:48) --------------------------------------------- Держи
Код
hpwExecRegExpList "<span style=[#34]font-size:|<span style=[#34]font-family:|<span style=[#34]color:|</span>" "[TextEntry1]" "[#13]" "[TextEntry3]" hpwExecRegExpPos "<span style=[#34]font-size:|<span style=[#34]font-family:|<span style=[#34]color:|</span>" "[TextEntry1]" "[TextEntry]" StrReplace "[TextEntry3]" "<span style=[#34]font-size:" "[#91]/size[#93]" "[TextEntry3]" "" StrReplace "[TextEntry3]" "<span style=[#34]font-family:" "[#91]/font[#93]" "[TextEntry3]" "" StrReplace "[TextEntry3]" "<span style=[#34]color:" "[#91]/color[#93]" "[TextEntry3]" "" hpwLineCount "[TextEntry3]" "[LineCount]" ShowErrors "False" While "[LineCount]" "<>" "0" hpwLine "[TextEntry3]" "[LineCount]" "[/span]" If "[/span]" "=" "</span>" hpwLine "[TextEntry]" "[LineCount]" "[RegExpPos]" StrParse "[RegExpPos]" "|" "[RegExpPos]" "" StrDel "[TextEntry1]" "[RegExpPos1]" "[RegExpPos2]" "[TextEntry1]" SetVar "[Num]" "[LineCount]-1" :Span hpwLine "[TextEntry3]" "[Num]" "[Teg]" If "[Teg]" "=" "</span>" SetVar "[Num]" "[Num]-1" GotoLine ":Span" EndIf :Teg IfEx "[Teg] <> [#34]</span>[#34] and [Num] > 0" SetVar "[Num]" "[Num]-1" hpwLine "[TextEntry3]" "[Num]" "[Teg]" GotoLine ":Teg" Else SetVar "[Num]" "[Num]+1" hpwLine "[TextEntry3]" "[Num]" "[Teg]" StrIns "[Teg]" "[TextEntry1]" "[RegExpPos1]" "[TextEntry1]" hpwLineDelete "[TextEntry]" "[LineCount]" "[TextEntry]" hpwLineDelete "[TextEntry3]" "[LineCount]" "[TextEntry3]" hpwLineDelete "[TextEntry]" "[Num]" "[TextEntry]" hpwLineDelete "[TextEntry3]" "[Num]" "[TextEntry3]" hpwLineCount "[TextEntry3]" "[LineCount]" EndIf Else EndIf EndWhile hpwReplaceRegExp "<span style=[#34]font-size:" "[TextEntry1]" "[#91]size=" "" "[TextEntry1]" hpwReplaceRegExp "<span style=[#34]font-family:" "[TextEntry1]" "[#91]font=" "" "[TextEntry1]" hpwReplaceRegExp "<span style=[#34]color:" "[TextEntry1]" "[#91]color=" "" "[TextEntry1]" hpwReplaceRegExp ";[#34]>|[#34]>" "[TextEntry1]" "[#93]" "" "[TextEntry1]"
Давай следующие предложения. Цитата UIYOYXB (
)
Для примера будем парсить и преобразовывать вот это:
И для примера измени еще теги на bb-code, что б было с чем сравнивать. Изменил код. Теперь по моему правильно. Проверяй.
Не хочешь читать хелп? Если хелп и форум не помогли, тогда все ответы здесь Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
Сообщение отредактировано mishem - Пт, 30 Января 2015, 20:43
Сообщение UIYOYXB , еще раз повторяю, сделать что то универсальное, НЕ ВОЗМОЖНО. Я так понимаю дальше задачи будут усложняться. Предвидеть всех вариантов просто не возможно. Не правильное написание, не правильный синтаксис, ошибки и т.д. Можно взять отдельный участок кода и именно для него что то сделать, пытаться объять не объятное не получится. Добавлено (29 Января 2015, 23:48) --------------------------------------------- Держи
Код
hpwExecRegExpList "<span style=[#34]font-size:|<span style=[#34]font-family:|<span style=[#34]color:|</span>" "[TextEntry1]" "[#13]" "[TextEntry3]" hpwExecRegExpPos "<span style=[#34]font-size:|<span style=[#34]font-family:|<span style=[#34]color:|</span>" "[TextEntry1]" "[TextEntry]" StrReplace "[TextEntry3]" "<span style=[#34]font-size:" "[#91]/size[#93]" "[TextEntry3]" "" StrReplace "[TextEntry3]" "<span style=[#34]font-family:" "[#91]/font[#93]" "[TextEntry3]" "" StrReplace "[TextEntry3]" "<span style=[#34]color:" "[#91]/color[#93]" "[TextEntry3]" "" hpwLineCount "[TextEntry3]" "[LineCount]" ShowErrors "False" While "[LineCount]" "<>" "0" hpwLine "[TextEntry3]" "[LineCount]" "[/span]" If "[/span]" "=" "</span>" hpwLine "[TextEntry]" "[LineCount]" "[RegExpPos]" StrParse "[RegExpPos]" "|" "[RegExpPos]" "" StrDel "[TextEntry1]" "[RegExpPos1]" "[RegExpPos2]" "[TextEntry1]" SetVar "[Num]" "[LineCount]-1" :Span hpwLine "[TextEntry3]" "[Num]" "[Teg]" If "[Teg]" "=" "</span>" SetVar "[Num]" "[Num]-1" GotoLine ":Span" EndIf :Teg IfEx "[Teg] <> [#34]</span>[#34] and [Num] > 0" SetVar "[Num]" "[Num]-1" hpwLine "[TextEntry3]" "[Num]" "[Teg]" GotoLine ":Teg" Else SetVar "[Num]" "[Num]+1" hpwLine "[TextEntry3]" "[Num]" "[Teg]" StrIns "[Teg]" "[TextEntry1]" "[RegExpPos1]" "[TextEntry1]" hpwLineDelete "[TextEntry]" "[LineCount]" "[TextEntry]" hpwLineDelete "[TextEntry3]" "[LineCount]" "[TextEntry3]" hpwLineDelete "[TextEntry]" "[Num]" "[TextEntry]" hpwLineDelete "[TextEntry3]" "[Num]" "[TextEntry3]" hpwLineCount "[TextEntry3]" "[LineCount]" EndIf Else EndIf EndWhile hpwReplaceRegExp "<span style=[#34]font-size:" "[TextEntry1]" "[#91]size=" "" "[TextEntry1]" hpwReplaceRegExp "<span style=[#34]font-family:" "[TextEntry1]" "[#91]font=" "" "[TextEntry1]" hpwReplaceRegExp "<span style=[#34]color:" "[TextEntry1]" "[#91]color=" "" "[TextEntry1]" hpwReplaceRegExp ";[#34]>|[#34]>" "[TextEntry1]" "[#93]" "" "[TextEntry1]"
Давай следующие предложения. Цитата UIYOYXB (
)
Для примера будем парсить и преобразовывать вот это:
И для примера измени еще теги на bb-code, что б было с чем сравнивать. Изменил код. Теперь по моему правильно. Проверяй. Автор - mishem Дата добавления - 30 Января 2015 в 00:00
UIYOYXB Дата: Пт, 30 Января 2015, 00:44 | Сообщение # 16
Цитата mishem (
)
Изменил код. Теперь по моему правильно. Проверяй.
К сожалению опять немного не то Тем не менее огромное Вам спасибо как за первый пример так и за второй, и Callisto спасибо. С использованием поиска на регулярных выражениях я вроде таки могу выделить структуру документа, если все получится то выложу код или чуть чуть попозже или завтра, а то глаза уже слипаются
Сообщение отредактировано UIYOYXB - Пт, 30 Января 2015, 00:49
Сообщение Цитата mishem (
)
Изменил код. Теперь по моему правильно. Проверяй.
К сожалению опять немного не то Тем не менее огромное Вам спасибо как за первый пример так и за второй, и Callisto спасибо. С использованием поиска на регулярных выражениях я вроде таки могу выделить структуру документа, если все получится то выложу код или чуть чуть попозже или завтра, а то глаза уже слипаются Автор - UIYOYXB Дата добавления - 30 Января 2015 в 00:44
mishem Дата: Пт, 30 Января 2015, 00:53 | Сообщение # 17
Не, все равно не правильно. Не возможно предвидеть все результаты. Если есть желание, бейся дальше. Направление есть. Я пас. Добавлено (30 Января 2015, 00:53) --------------------------------------------- Цитата UIYOYXB (
)
К сожалению опять немного не то
Да, я уже увидел. Нельзя посчитать и определить все закрывающиеся теги и в каком именно месте какой должен находится. Еще раз говорю, нужно точно знать структуру документа, тогда можно разбить на блоки и уже как то можно будет ориентироваться. А универсальный вариант все равно не получится. Даже просто как вариант, представим что в самом тексте например есть что то типа такого: Код
Для того чтобы изменить цвет текста нужно вставить тег <span style="color:#1155cc">, а ты вставляешь <span style="font-family:Arial">. Это же не правильно.
И все. Не возможно будет его правильно распарсить. Это один из тысячи возможных вариантов.
Не хочешь читать хелп? Если хелп и форум не помогли, тогда все ответы здесь Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
Сообщение отредактировано mishem - Пт, 30 Января 2015, 00:54
Сообщение Не, все равно не правильно. Не возможно предвидеть все результаты. Если есть желание, бейся дальше. Направление есть. Я пас. Добавлено (30 Января 2015, 00:53) --------------------------------------------- Цитата UIYOYXB (
)
К сожалению опять немного не то
Да, я уже увидел. Нельзя посчитать и определить все закрывающиеся теги и в каком именно месте какой должен находится. Еще раз говорю, нужно точно знать структуру документа, тогда можно разбить на блоки и уже как то можно будет ориентироваться. А универсальный вариант все равно не получится. Даже просто как вариант, представим что в самом тексте например есть что то типа такого: Код
Для того чтобы изменить цвет текста нужно вставить тег <span style="color:#1155cc">, а ты вставляешь <span style="font-family:Arial">. Это же не правильно.
И все. Не возможно будет его правильно распарсить. Это один из тысячи возможных вариантов. Автор - mishem Дата добавления - 30 Января 2015 в 00:53
UIYOYXB Дата: Пт, 30 Января 2015, 02:04 | Сообщение # 18
Цитата mishem (
)
Даже просто как вариант, представим что в самом тексте например есть что то типа такого:
Ошибки в html быть не может, код html тегов валидный на все 100% поэтому ошибки в них исключаем Цитата mishem (
)
Да, я уже увидел. Нельзя посчитать и определить все закрывающиеся теги и в каком именно месте какой должен находится.
По идее можно, например вот уже если я не ошибаюсь то правильно определяю где самый последний тег и правильно его закрываю но где то бага закралась и не зацикливаются подпрограммы, ну уже глаза слипаются так что буду детально колупать уже завтра. В исходнике пример того как я нахожу самый последний вложенный тег
Сообщение отредактировано UIYOYXB - Пт, 30 Января 2015, 02:08
Сообщение Цитата mishem (
)
Даже просто как вариант, представим что в самом тексте например есть что то типа такого:
Ошибки в html быть не может, код html тегов валидный на все 100% поэтому ошибки в них исключаем Цитата mishem (
)
Да, я уже увидел. Нельзя посчитать и определить все закрывающиеся теги и в каком именно месте какой должен находится.
По идее можно, например вот уже если я не ошибаюсь то правильно определяю где самый последний тег и правильно его закрываю но где то бага закралась и не зацикливаются подпрограммы, ну уже глаза слипаются так что буду детально колупать уже завтра. В исходнике пример того как я нахожу самый последний вложенный тег Автор - UIYOYXB Дата добавления - 30 Января 2015 в 02:04
Callisto Дата: Пт, 30 Января 2015, 03:34 | Сообщение # 19
Хочется уточнить ТЗ, подразумевается, что будет применяться только тег <span> или могут быть и другие в тексте?
Пожалуйста, не надо ко мне на "Вы", а то чувствую себя бабулькой)
Сообщение Хочется уточнить ТЗ, подразумевается, что будет применяться только тег <span> или могут быть и другие в тексте? Автор - Callisto Дата добавления - 30 Января 2015 в 03:34
DEMBEL Дата: Пт, 30 Января 2015, 11:19 | Сообщение # 20
Я бы просто искал в строке закрывающий тег, затем от этой позиции шел назад обратным поиском до открывающего и тестил его на соответствие бб-коду, затем зная обе позиции производил замену, далее процесс повторяется.
Как задавать вопросы Win7x64 SP1 Neobook v5.70 (Trial) WinXP SP3 Neobook v5.62
Сообщение Я бы просто искал в строке закрывающий тег, затем от этой позиции шел назад обратным поиском до открывающего и тестил его на соответствие бб-коду, затем зная обе позиции производил замену, далее процесс повторяется. Автор - DEMBEL Дата добавления - 30 Января 2015 в 11:19
mishem Дата: Пт, 30 Января 2015, 20:42 | Сообщение # 21
Цитата DEMBEL (
)
Я бы просто искал в строке закрывающий тег, затем от этой позиции шел назад обратным поиском до открывающего
Хорошая мысль.
Код
hpwReplaceRegExp ";[#34]>|[#34]>" "[TextEntry1]" "[#93]" "" "[TextEntry1]" hpwExecRegExpPos "</span>" "[TextEntry1]" "[Span]" hpwExecRegExpPos "<span style=[#34].{1,20}:" "[TextEntry1]" "[Span_style]" hpwReplaceRegExp "\|\d{1,3}" "[Span]" "" "" "[Span]" hpwReplaceRegExp "\|\d{1,3}" "[Span_style]" "" "" "[Span_style]" hpwExecRegExpList "<span style=[#34].{1,20}:" "[TextEntry1]" "[#13]" "[Span_styleText]" hpwLine "[Span]" "1" "[SpanNum]" hpwLineCount "[Span_style]" "[LineCount]" If "[LineCount]" "=" "0" Return EndIf Loop "1" "[LineCount]" "[i]" hpwLine "[Span_style]" "[i]" "[Span_styleNum]" If "[Span_styleNum]" ">" "[SpanNum]" SetVar "[i]" "[i]-1" ExitLoop EndIf EndLoop hpwLine "[Span_style]" "[i]" "[Span_styleNum]" hpwLine "[Span_styleText]" "[i]" "[TegText]" If "[TegText]" "=" "<span style=[#34]font-size:" StrDel "[TextEntry1]" "[SpanNum]" "7" "[TextEntry1]" StrIns "[#91]/size[#93]" "[TextEntry1]" "[SpanNum]" "[TextEntry1]" StrDel "[TextEntry1]" "[Span_styleNum]" "23" "[TextEntry1]" StrIns "[#91]size=" "[TextEntry1]" "[Span_styleNum]" "[TextEntry1]" EndIf If "[TegText]" "=" "<span style=[#34]font-family:" StrDel "[TextEntry1]" "[SpanNum]" "7" "[TextEntry1]" StrIns "[#91]/font[#93]" "[TextEntry1]" "[SpanNum]" "[TextEntry1]" StrDel "[TextEntry1]" "[Span_styleNum]" "25" "[TextEntry1]" StrIns "[#91]font=" "[TextEntry1]" "[Span_styleNum]" "[TextEntry1]" EndIf If "[TegText]" "=" "<span style=[#34]color:" StrDel "[TextEntry1]" "[SpanNum]" "7" "[TextEntry1]" StrIns "[#91]/color[#93]" "[TextEntry1]" "[SpanNum]" "[TextEntry1]" StrDel "[TextEntry1]" "[Span_styleNum]" "19" "[TextEntry1]" StrIns "[#91]color=" "[TextEntry1]" "[Span_styleNum]" "[TextEntry1]" EndIf GotoLine "2" ClearVariables "LineCount,i,Span_styleNum,TegText"
То же самое, но в другом исполнении. Код покороче.
Код
SetVar "[Text]" "[TextEntry1]" hpwReplaceRegExp ";[#34]>|[#34]>" "[Text]" "[#93]" "" "[Text]" SearchStr "</span>" "[Text]" "[SpanNum]" "" hpwExecRegExpPos "<span style=[#34].{1,20}:" "[Text]" "[Span_style]" hpwReplaceRegExp "\|\d{1,3}" "[Span_style]" "" "" "[Span_style]" hpwExecRegExpList "<span style=[#34].{1,20}:" "[Text]" "[#13]" "[Span_styleText]" hpwLineCount "[Span_style]" "[LineCount]" If "[LineCount]" "=" "0" SetVar "[TextEntry1]" "[Text]" ClearVariables "LineCount,i,Span_styleNum,TegText,Text,SpanNum" DeleteArray "[TegTextParse]" "All" DeleteArray "[StrInsParse]" "All" DeleteArray "[StrDelParse]" "All" Return EndIf Loop "1" "[LineCount]" "[i]" hpwLine "[Span_style]" "[i]" "[Span_styleNum]" If "[Span_styleNum]" ">" "[SpanNum]" SetVar "[i]" "[i]-1" ExitLoop EndIf EndLoop hpwLine "[Span_style]" "[i]" "[Span_styleNum]" hpwLine "[Span_styleText]" "[i]" "[TegText]" StrParse "<span style=[#34]font-size:|<span style=[#34]font-family:|<span style=[#34]color:" "|" "[TegTextParse]" "" StrParse "size|font|color" "|" "[StrInsParse]" "" StrParse "23|25|19" "|" "[StrDelParse]" "" Loop "1" "3" "[i]" If "[TegText]" "=" "[TegTextParse[i]]" StrDel "[Text]" "[SpanNum]" "7" "[Text]" StrIns "[#91]/[StrInsParse[i]][#93]" "[Text]" "[SpanNum]" "[Text]" StrDel "[Text]" "[Span_styleNum]" "[StrDelParse[i]]" "[Text]" StrIns "[#91][StrInsParse[i]]=" "[Text]" "[Span_styleNum]" "[Text]" EndIf EndLoop GotoLine "3"
Не хочешь читать хелп? Если хелп и форум не помогли, тогда все ответы здесь Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
Сообщение отредактировано mishem - Пт, 30 Января 2015, 21:18
Сообщение Цитата DEMBEL (
)
Я бы просто искал в строке закрывающий тег, затем от этой позиции шел назад обратным поиском до открывающего
Хорошая мысль.
Код
hpwReplaceRegExp ";[#34]>|[#34]>" "[TextEntry1]" "[#93]" "" "[TextEntry1]" hpwExecRegExpPos "</span>" "[TextEntry1]" "[Span]" hpwExecRegExpPos "<span style=[#34].{1,20}:" "[TextEntry1]" "[Span_style]" hpwReplaceRegExp "\|\d{1,3}" "[Span]" "" "" "[Span]" hpwReplaceRegExp "\|\d{1,3}" "[Span_style]" "" "" "[Span_style]" hpwExecRegExpList "<span style=[#34].{1,20}:" "[TextEntry1]" "[#13]" "[Span_styleText]" hpwLine "[Span]" "1" "[SpanNum]" hpwLineCount "[Span_style]" "[LineCount]" If "[LineCount]" "=" "0" Return EndIf Loop "1" "[LineCount]" "[i]" hpwLine "[Span_style]" "[i]" "[Span_styleNum]" If "[Span_styleNum]" ">" "[SpanNum]" SetVar "[i]" "[i]-1" ExitLoop EndIf EndLoop hpwLine "[Span_style]" "[i]" "[Span_styleNum]" hpwLine "[Span_styleText]" "[i]" "[TegText]" If "[TegText]" "=" "<span style=[#34]font-size:" StrDel "[TextEntry1]" "[SpanNum]" "7" "[TextEntry1]" StrIns "[#91]/size[#93]" "[TextEntry1]" "[SpanNum]" "[TextEntry1]" StrDel "[TextEntry1]" "[Span_styleNum]" "23" "[TextEntry1]" StrIns "[#91]size=" "[TextEntry1]" "[Span_styleNum]" "[TextEntry1]" EndIf If "[TegText]" "=" "<span style=[#34]font-family:" StrDel "[TextEntry1]" "[SpanNum]" "7" "[TextEntry1]" StrIns "[#91]/font[#93]" "[TextEntry1]" "[SpanNum]" "[TextEntry1]" StrDel "[TextEntry1]" "[Span_styleNum]" "25" "[TextEntry1]" StrIns "[#91]font=" "[TextEntry1]" "[Span_styleNum]" "[TextEntry1]" EndIf If "[TegText]" "=" "<span style=[#34]color:" StrDel "[TextEntry1]" "[SpanNum]" "7" "[TextEntry1]" StrIns "[#91]/color[#93]" "[TextEntry1]" "[SpanNum]" "[TextEntry1]" StrDel "[TextEntry1]" "[Span_styleNum]" "19" "[TextEntry1]" StrIns "[#91]color=" "[TextEntry1]" "[Span_styleNum]" "[TextEntry1]" EndIf GotoLine "2" ClearVariables "LineCount,i,Span_styleNum,TegText"
То же самое, но в другом исполнении. Код покороче.
Код
SetVar "[Text]" "[TextEntry1]" hpwReplaceRegExp ";[#34]>|[#34]>" "[Text]" "[#93]" "" "[Text]" SearchStr "</span>" "[Text]" "[SpanNum]" "" hpwExecRegExpPos "<span style=[#34].{1,20}:" "[Text]" "[Span_style]" hpwReplaceRegExp "\|\d{1,3}" "[Span_style]" "" "" "[Span_style]" hpwExecRegExpList "<span style=[#34].{1,20}:" "[Text]" "[#13]" "[Span_styleText]" hpwLineCount "[Span_style]" "[LineCount]" If "[LineCount]" "=" "0" SetVar "[TextEntry1]" "[Text]" ClearVariables "LineCount,i,Span_styleNum,TegText,Text,SpanNum" DeleteArray "[TegTextParse]" "All" DeleteArray "[StrInsParse]" "All" DeleteArray "[StrDelParse]" "All" Return EndIf Loop "1" "[LineCount]" "[i]" hpwLine "[Span_style]" "[i]" "[Span_styleNum]" If "[Span_styleNum]" ">" "[SpanNum]" SetVar "[i]" "[i]-1" ExitLoop EndIf EndLoop hpwLine "[Span_style]" "[i]" "[Span_styleNum]" hpwLine "[Span_styleText]" "[i]" "[TegText]" StrParse "<span style=[#34]font-size:|<span style=[#34]font-family:|<span style=[#34]color:" "|" "[TegTextParse]" "" StrParse "size|font|color" "|" "[StrInsParse]" "" StrParse "23|25|19" "|" "[StrDelParse]" "" Loop "1" "3" "[i]" If "[TegText]" "=" "[TegTextParse[i]]" StrDel "[Text]" "[SpanNum]" "7" "[Text]" StrIns "[#91]/[StrInsParse[i]][#93]" "[Text]" "[SpanNum]" "[Text]" StrDel "[Text]" "[Span_styleNum]" "[StrDelParse[i]]" "[Text]" StrIns "[#91][StrInsParse[i]]=" "[Text]" "[Span_styleNum]" "[Text]" EndIf EndLoop GotoLine "3"
Автор - mishem Дата добавления - 30 Января 2015 в 20:42
UIYOYXB Дата: Пт, 30 Января 2015, 20:44 | Сообщение # 22
Вообщем я разобрался где был баг, теперь все работает как надо Идет корректное преобразование html тегов в bb-code и правильно закрывает bb-code. Принцип работы заключается в создании образной структуры документа когда находятся позиции всех открывающих тегов span, после чего преобразовывается самый последний тег span который не может иметь в себе вложенных тегов span, а следовательно закрывающий тег span будет принадлежать ему. Если кто захочет более детально разобраться то исходник в архиве Цитата Callisto (
)
Хочется уточнить ТЗ, подразумевается, что будет применяться только тег <span> или могут быть и другие в тексте?
Вообще я буду преобразовывать наиболее распространенные html теги в bb-code (форматирование текста, ссылки, изображения), которые могут иметь неограниченное количество вложений и соответственно неограниченное количество в самом документе, просто тут рассматривал ту функцию на которой я немного застрял Цитата DEMBEL (
)
Я бы просто искал в строке закрывающий тег, затем от этой позиции шел назад обратным поиском до открывающего и тестил его на соответствие бб-коду, затем зная обе позиции производил замену, далее процесс повторяется.
Точно так и делаю, только поиск идет по открывающему тегу что немного облегчает задачу по выборе функции которая будет преобразовывать html тег в bb-code. mishem , ух ты, Ваш новый пример работает тоже так как нужно и имеет меньше кода чем мой PS Всем спасибо за подсказки
Сообщение отредактировано UIYOYXB - Пт, 30 Января 2015, 20:57
Сообщение Вообщем я разобрался где был баг, теперь все работает как надо Идет корректное преобразование html тегов в bb-code и правильно закрывает bb-code. Принцип работы заключается в создании образной структуры документа когда находятся позиции всех открывающих тегов span, после чего преобразовывается самый последний тег span который не может иметь в себе вложенных тегов span, а следовательно закрывающий тег span будет принадлежать ему. Если кто захочет более детально разобраться то исходник в архиве Цитата Callisto (
)
Хочется уточнить ТЗ, подразумевается, что будет применяться только тег <span> или могут быть и другие в тексте?
Вообще я буду преобразовывать наиболее распространенные html теги в bb-code (форматирование текста, ссылки, изображения), которые могут иметь неограниченное количество вложений и соответственно неограниченное количество в самом документе, просто тут рассматривал ту функцию на которой я немного застрял Цитата DEMBEL (
)
Я бы просто искал в строке закрывающий тег, затем от этой позиции шел назад обратным поиском до открывающего и тестил его на соответствие бб-коду, затем зная обе позиции производил замену, далее процесс повторяется.
Точно так и делаю, только поиск идет по открывающему тегу что немного облегчает задачу по выборе функции которая будет преобразовывать html тег в bb-code. mishem , ух ты, Ваш новый пример работает тоже так как нужно и имеет меньше кода чем мой PS Всем спасибо за подсказки Автор - UIYOYXB Дата добавления - 30 Января 2015 в 20:44
Сообщение Цитата UIYOYXB (
)
и имеет меньше кода
Выше добавил еще покороче. Автор - mishem Дата добавления - 30 Января 2015 в 21:20
UIYOYXB Дата: Пт, 30 Января 2015, 23:13 | Сообщение # 24
Цитата mishem (
)
Выше добавил еще покороче.
Сообщение Цитата mishem (
)
Выше добавил еще покороче.
Автор - UIYOYXB Дата добавления - 30 Января 2015 в 23:13
mishem Дата: Вс, 01 Февраля 2015, 15:29 | Сообщение # 25
Этот алгоритм работает быстрее чем предыдущий:
Код
SetVar "[Text1]" "[TextEntry1]" hpwReplaceRegExp ";[#34]>|[#34]>" "[Text1]" "[#93]" "" "[Text1]" StrParse "<span style=[#34]font-size:|<span style=[#34]font-family:|<span style=[#34]color:" "|" "[TegTextParse]" "" StrParse "size|font|color" "|" "[StrInsParse]" "" hpwExecRegExpList "(<span)[#91]^\<.[#93]*?</span>{1}" "[Text1]" "[#13]" "[RegExpList]" hpwExecRegExpPos "(<span)[#91]^\<.[#93]*?</span>{1}" "[Text1]" "[RegExpPos]" hpwLineCount "[RegExpPos]" "[LineCount]" While "[LineCount]" "<>" "0" SetVar "[Count]" "[LineCount]" Loop "1" "[LineCount]" "[i]" hpwLine "[RegExpList]" "[Count]" "[Text]" Loop "1" "3" "[n]" hpwExecRegExpBool "[TegTextParse[n]]" "[Text]" "[Result]" If "[Result]" "=" "1" StrReplace "[Text]" "[TegTextParse[n]]" "[#91][StrInsParse[n]]=" "[Text]" "" StrReplace "[Text]" "</span>" "[#91]/[StrInsParse[n]][#93]" "[Text]" "" hpwLine "[RegExpPos]" "[Count]" "[Result]" StrParse "[Result]" "|" "[Result]" "" StrDel "[Text1]" "[Result1]" "[Result2]" "[Text1]" StrIns "[Text]" "[Text1]" "[Result1]" "[Text1]" ExitLoop EndIf EndLoop SetVar "[Count]" "[Count]-1" EndLoop hpwExecRegExpList "(<span)[#91]^\<.[#93]*?</span>{1}" "[Text1]" "[#13]" "[RegExpList]" hpwExecRegExpPos "(<span)[#91]^\<.[#93]*?</span>{1}" "[Text1]" "[RegExpPos]" hpwLineCount "[RegExpPos]" "[LineCount]" EndWhile SetVar "[TextEntry1]" "[Text1]" ClearVariables "LineCount,Count,i,Text,n,Result,Text1" DeleteArray "[TegTextParse]" "All" DeleteArray "[StrInsParse]" "All" DeleteArray "[Result]" "All"
А этот еще чуть быстрее
Код
SetVar "[Text1]" "[TextEntry1]" hpwReplaceRegExp "<span style=[#34]font-size:" "[Text1]" "<size=" "" "[Text1]" hpwReplaceRegExp "<span style=[#34]font-family:" "[Text1]" "<font=" "" "[Text1]" hpwReplaceRegExp "<span style=[#34]color:" "[Text1]" "<color=" "" "[Text1]" hpwReplaceRegExp ";[#34]>|[#34]>" "[Text1]" "[#93]" "" "[Text1]" hpwExecRegExpPos "<[#91]^<.[#93]*?</span>" "[Text1]" "[RegExpPos]" hpwExecRegExpList "<[#91]^<.[#93]*?</span>" "[Text1]" "[#13]" "[RegExpList]" hpwLineCount "[RegExpPos]" "[LineCount]" StrParse "size|font|color" "|" "[StrInsParse]" "" While "[LineCount]" "<>" "0" SetVar "[Count]" "[LineCount]" Loop "1" "[LineCount]" "[i]" hpwLine "[RegExpList]" "[Count]" "[Text]" Loop "1" "3" "[n]" SearchStr "<[StrInsParse[n]]=" "[Text]" "[Result]" "" If "[Result]" "<>" "0" StrReplace "[Text]" "</span>" "[#91]/[StrInsParse[n]][#93]" "[Text]" "" StrReplace "[Text]" "<" "[#91]" "[Text]" "" hpwLine "[RegExpPos]" "[Count]" "[Result]" StrParse "[Result]" "|" "[Result]" "" StrDel "[Text1]" "[Result1]" "[Result2]" "[Text1]" StrIns "[Text]" "[Text1]" "[Result1]" "[Text1]" ExitLoop EndIf EndLoop SetVar "[Count]" "[Count]-1" EndLoop hpwExecRegExpPos "<[#91]^<.[#93]*?</span>" "[Text1]" "[RegExpPos]" hpwExecRegExpList "<[#91]^<.[#93]*?</span>" "[Text1]" "[#13]" "[RegExpList]" hpwLineCount "[RegExpPos]" "[LineCount]" EndWhile SetVar "[TextEntry1]" "[Text1]" ClearVariables "LineCount,Count,i,Text,n,Result,Text1" DeleteArray "[StrInsParse]" "All" DeleteArray "[Result]" "All"
Не хочешь читать хелп? Если хелп и форум не помогли, тогда все ответы здесь Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
Сообщение Этот алгоритм работает быстрее чем предыдущий:
Код
SetVar "[Text1]" "[TextEntry1]" hpwReplaceRegExp ";[#34]>|[#34]>" "[Text1]" "[#93]" "" "[Text1]" StrParse "<span style=[#34]font-size:|<span style=[#34]font-family:|<span style=[#34]color:" "|" "[TegTextParse]" "" StrParse "size|font|color" "|" "[StrInsParse]" "" hpwExecRegExpList "(<span)[#91]^\<.[#93]*?</span>{1}" "[Text1]" "[#13]" "[RegExpList]" hpwExecRegExpPos "(<span)[#91]^\<.[#93]*?</span>{1}" "[Text1]" "[RegExpPos]" hpwLineCount "[RegExpPos]" "[LineCount]" While "[LineCount]" "<>" "0" SetVar "[Count]" "[LineCount]" Loop "1" "[LineCount]" "[i]" hpwLine "[RegExpList]" "[Count]" "[Text]" Loop "1" "3" "[n]" hpwExecRegExpBool "[TegTextParse[n]]" "[Text]" "[Result]" If "[Result]" "=" "1" StrReplace "[Text]" "[TegTextParse[n]]" "[#91][StrInsParse[n]]=" "[Text]" "" StrReplace "[Text]" "</span>" "[#91]/[StrInsParse[n]][#93]" "[Text]" "" hpwLine "[RegExpPos]" "[Count]" "[Result]" StrParse "[Result]" "|" "[Result]" "" StrDel "[Text1]" "[Result1]" "[Result2]" "[Text1]" StrIns "[Text]" "[Text1]" "[Result1]" "[Text1]" ExitLoop EndIf EndLoop SetVar "[Count]" "[Count]-1" EndLoop hpwExecRegExpList "(<span)[#91]^\<.[#93]*?</span>{1}" "[Text1]" "[#13]" "[RegExpList]" hpwExecRegExpPos "(<span)[#91]^\<.[#93]*?</span>{1}" "[Text1]" "[RegExpPos]" hpwLineCount "[RegExpPos]" "[LineCount]" EndWhile SetVar "[TextEntry1]" "[Text1]" ClearVariables "LineCount,Count,i,Text,n,Result,Text1" DeleteArray "[TegTextParse]" "All" DeleteArray "[StrInsParse]" "All" DeleteArray "[Result]" "All"
А этот еще чуть быстрее
Код
SetVar "[Text1]" "[TextEntry1]" hpwReplaceRegExp "<span style=[#34]font-size:" "[Text1]" "<size=" "" "[Text1]" hpwReplaceRegExp "<span style=[#34]font-family:" "[Text1]" "<font=" "" "[Text1]" hpwReplaceRegExp "<span style=[#34]color:" "[Text1]" "<color=" "" "[Text1]" hpwReplaceRegExp ";[#34]>|[#34]>" "[Text1]" "[#93]" "" "[Text1]" hpwExecRegExpPos "<[#91]^<.[#93]*?</span>" "[Text1]" "[RegExpPos]" hpwExecRegExpList "<[#91]^<.[#93]*?</span>" "[Text1]" "[#13]" "[RegExpList]" hpwLineCount "[RegExpPos]" "[LineCount]" StrParse "size|font|color" "|" "[StrInsParse]" "" While "[LineCount]" "<>" "0" SetVar "[Count]" "[LineCount]" Loop "1" "[LineCount]" "[i]" hpwLine "[RegExpList]" "[Count]" "[Text]" Loop "1" "3" "[n]" SearchStr "<[StrInsParse[n]]=" "[Text]" "[Result]" "" If "[Result]" "<>" "0" StrReplace "[Text]" "</span>" "[#91]/[StrInsParse[n]][#93]" "[Text]" "" StrReplace "[Text]" "<" "[#91]" "[Text]" "" hpwLine "[RegExpPos]" "[Count]" "[Result]" StrParse "[Result]" "|" "[Result]" "" StrDel "[Text1]" "[Result1]" "[Result2]" "[Text1]" StrIns "[Text]" "[Text1]" "[Result1]" "[Text1]" ExitLoop EndIf EndLoop SetVar "[Count]" "[Count]-1" EndLoop hpwExecRegExpPos "<[#91]^<.[#93]*?</span>" "[Text1]" "[RegExpPos]" hpwExecRegExpList "<[#91]^<.[#93]*?</span>" "[Text1]" "[#13]" "[RegExpList]" hpwLineCount "[RegExpPos]" "[LineCount]" EndWhile SetVar "[TextEntry1]" "[Text1]" ClearVariables "LineCount,Count,i,Text,n,Result,Text1" DeleteArray "[StrInsParse]" "All" DeleteArray "[Result]" "All"
Автор - mishem Дата добавления - 01 Февраля 2015 в 15:29
ponand Дата: Вс, 01 Февраля 2015, 18:35 | Сообщение # 26
а может так ? Код
hpwReplaceRegExp "<span style=.font-size:" "[TextEntry1]" "<size=" "" "[Text1]" hpwReplaceRegExp "<span style=.font-family:" "[Text1]" "<font=" "" "[Text1]" hpwReplaceRegExp "<span style=.color:" "[Text1]" "<color=" "" "[Text1]" hpwReplaceRegExp ";?[#34]>" "[Text1]" "[#93]" "" "[Text1]" While "[RegExpPos]" "<>" "0" hpwSubstituteRegExp "(.*)<([#91]^=/[#93]*)=([#91]^[#93][#93]*)\[#93]([#91]^>[#93]+)</span>(.*)$" "[Text1]" "$1[#91]$2=$3[#93]$4[#91]/$2[#93]$5" "[Text1]" hpwExecRegExpBool "</span>" "[Text1]" "[RegExpPos]" EndWhile SetVar "[TextEntry1]" "[Text1]" ClearVariables "RegExpPos,Text1"
Сообщение а может так ? Код
hpwReplaceRegExp "<span style=.font-size:" "[TextEntry1]" "<size=" "" "[Text1]" hpwReplaceRegExp "<span style=.font-family:" "[Text1]" "<font=" "" "[Text1]" hpwReplaceRegExp "<span style=.color:" "[Text1]" "<color=" "" "[Text1]" hpwReplaceRegExp ";?[#34]>" "[Text1]" "[#93]" "" "[Text1]" While "[RegExpPos]" "<>" "0" hpwSubstituteRegExp "(.*)<([#91]^=/[#93]*)=([#91]^[#93][#93]*)\[#93]([#91]^>[#93]+)</span>(.*)$" "[Text1]" "$1[#91]$2=$3[#93]$4[#91]/$2[#93]$5" "[Text1]" hpwExecRegExpBool "</span>" "[Text1]" "[RegExpPos]" EndWhile SetVar "[TextEntry1]" "[Text1]" ClearVariables "RegExpPos,Text1"
Автор - ponand Дата добавления - 01 Февраля 2015 в 18:35
mishem Дата: Вс, 01 Февраля 2015, 19:45 | Сообщение # 27
Регулярка это сила, когда знаешь как ее правильно написать. Добавлено (01 Февраля 2015, 19:45) ---------------------------------------------ponand , если не сложно, распиши как работает твое регулярное выражение.
Не хочешь читать хелп? Если хелп и форум не помогли, тогда все ответы здесь Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
Сообщение Регулярка это сила, когда знаешь как ее правильно написать. Добавлено (01 Февраля 2015, 19:45) ---------------------------------------------ponand , если не сложно, распиши как работает твое регулярное выражение.
Автор - mishem Дата добавления - 01 Февраля 2015 в 19:45
ponand Дата: Вс, 01 Февраля 2015, 20:23 | Сообщение # 28
даже не знаю что можно там расписать, обычное выдергивание подстроки. поиск идет с конца текста, ищется подстрока максимально вложенная. попроще вариант и по надежнее может он будет более читабельный. Код
hpwReplaceRegExp "<span style=.font-size:" "[TextEntry1]" "<size=" "" "[Text]" hpwReplaceRegExp "<span style=.font-family:" "[Text]" "<font=" "" "[Text]" hpwReplaceRegExp "<span style=.color:" "[Text]" "<color=" "" "[Text]" hpwReplaceRegExp ";?[#34]>" "[Text]" "[#93]" "" "[Text]" :Next hpwSubstituteRegExp "(.*)<(size|font|color)=([#91]^[#93][#93]*)\[#93]([#91]^>[#93]+)</span>(.*)$" "[Text]" "$1[#91]$2=$3[#93]$4[#91]/$2[#93]$5" "[NewText]" If "[NewText]" "<>" "" SetVar "[Text]" "[NewText]" GotoLine "Next" EndIf SetVar "[TextEntry1]" "[Text]"
Сообщение отредактировано ponand - Вс, 01 Февраля 2015, 20:31
Сообщение даже не знаю что можно там расписать, обычное выдергивание подстроки. поиск идет с конца текста, ищется подстрока максимально вложенная. попроще вариант и по надежнее может он будет более читабельный. Код
hpwReplaceRegExp "<span style=.font-size:" "[TextEntry1]" "<size=" "" "[Text]" hpwReplaceRegExp "<span style=.font-family:" "[Text]" "<font=" "" "[Text]" hpwReplaceRegExp "<span style=.color:" "[Text]" "<color=" "" "[Text]" hpwReplaceRegExp ";?[#34]>" "[Text]" "[#93]" "" "[Text]" :Next hpwSubstituteRegExp "(.*)<(size|font|color)=([#91]^[#93][#93]*)\[#93]([#91]^>[#93]+)</span>(.*)$" "[Text]" "$1[#91]$2=$3[#93]$4[#91]/$2[#93]$5" "[NewText]" If "[NewText]" "<>" "" SetVar "[Text]" "[NewText]" GotoLine "Next" EndIf SetVar "[TextEntry1]" "[Text]"
Автор - ponand Дата добавления - 01 Февраля 2015 в 20:23