Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > JavaScript: Общие вопросы > Помогите подправить кодировщик |
Автор: animegirl 13.7.2013, 20:13 | ||||||||
В своей работе, использую функцию по перекодированию ббкод тэгов в обычные ХТМЛ тэги, проблема в том, что некоторые вложенные тэги создают ошибки. Моя функция:
Если сделать вложенное цитирование, например так
то я в итоге получаю блок цитаты с
внутри и
снаружи. Как мне подправить мою функцию, чтобы она могла разбирать вложенные тэги, без таких коллизий? ![]() |
Автор: Arantir 13.7.2013, 20:42 | ||||
Для начала - не использовать ленивые выражения для допускающих вложенность тегов. Точка - любой символ. Так что
После этого получится
Лучше будет сделать для тегов с вложенностью отдельною функцию замены и взвывать ее рекурсивно для найденной группы. |
Автор: animegirl 13.7.2013, 21:43 | ||
Arantir, Колдую над регуляркой, хочу её подправить, там где вы правильно указали, вместо "любой символ", хочу сделать "любой символ, кроме [цитата]", чё-то как не кручу, результат нулевой, хотя бы внутренняя цитаты обработалась бы, уже было чуток проще ( Добавлено через 29 секунд
|
Автор: animegirl 13.7.2013, 22:26 |
Arantir, Долго пыталась понять "А реально, почему бы и нет?", а потом поняла, да очень просто, если юзер не закроет тэг, он сможет сломать весь вид. А это раздолье для вандалов. Добавлено через 1 минуту и 15 секунд Arantir, По поводу ломки идеи, как раз таки нет, я поставлю процесс на рекурсию, и выходом будет тот факт, что строка не изменила свой вид. |
Автор: Arantir 13.7.2013, 22:44 | ||||||||||
Для этого не обязательно
Например, для строки
|
Автор: animegirl 13.7.2013, 22:59 | ||
Arantir, Не поняла, почему? Вот как я вижу эту рекурсию:
|
Автор: Arantir 13.7.2013, 23:00 | ||||
В физическом представлении моя доселе неосязаемая идея выглядит так:
Тест:
|
Автор: animegirl 13.7.2013, 23:10 | ||||||
В вашем примере выводятся 2 ошибки, которые неприемлемы логике вложеных тэгов, а именно в примерах
там выдаётся
хотя должно выглядеть так:
Добавлено через 1 минуту и 25 секунд Так в итоге, как переделать строку /\[quote](.*?)\[\/quote\]/igm, что бы там по середине исключалось открывание тэга [цитата]? |
Автор: Arantir 13.7.2013, 23:14 | ||||||||
Это бы прокатило и с обычным вариантом:
Просто с ним бы заменяло снаружи внутрь, а у Вас изнутри наружу. Мой вариант ищет крайние внешние, а Ваш - самые внутренние (которые без вложений). В обоих случаях постоянная замена в конце концов все позаменяет. Мой вариант с рекурсией лишь не ищет в лишнем тексте и не сравнивает его весь целиком.
![]() Добавлено через 9 минут и 7 секунд
Ну, вообще-то, после парсинга это уже не теги, а просто буковки в HTML-коде. В любом случае скрипт не может наверняка узнать, в каком именно месте пропущен тег. А что, если я пропустил его перед тройкой, а не перед ноликов, и так как у Вас быть не должно? =) Да и вообще:
|
Автор: animegirl 13.7.2013, 23:33 | ||||
Arantir,
приводит к той ошибке, что внутрений тэг меняется, а последующие внешние - нет. там надо сделать "не тэг цитаты И чтоб хотя бы один знак любой" Добавлено через 13 минут и 25 секунд Arantir, Готово, спасибо за пинание извилин в правильном направление ;) f
Логика регулярок для меня всё равно остаётся на уровне бизона хигинса, но задача выполняется как надо ) |
Автор: animegirl 14.7.2013, 03:09 | ||
Пытаюс добавить туда отказ обработки пустых цитат, на ум пришло сделать так:
но на деле не работает ( |
Автор: ksnk 14.7.2013, 08:58 |
animegirl, Парсинг bb - не самая простая задача. Для сложных вложенных тегов с параметрами, вообще говоря - комплектом регулярок не решается. Обычно, такое делается, используя "автомат со стеком". Выедается открывающий тег, укладывается на стек, когда встречается закрывающий тег - со стека берется последний открытый и с этой парой уже идет трансформация... На phpclub (внезапно? ![]() Другое дело, нужен ли парсер на JS или его уместнее делать на сервере? |
Автор: Arantir 14.7.2013, 08:59 | ||||||
Иногда проще разбить сложную задачу на подзадачи. У пользователей компы не бесконечно мощные, пожалейте их немножко ![]() Можно перед обработкой просто удалять все пустые \[quote\]. Заменять
А что останется - уже парсить в HTML. Добавлено через 8 минут и 11 секунд
Да, кстати, во многих форумных движках так и делается.
Может это просто WYSIWYG. В том числе, способ разгрузить сервер. А раз не сервер - сверхэффективный алгоритм делать не обязательно. |
Автор: animegirl 14.7.2013, 18:28 | ||||
Нужен на JS, причины: - сервер передаёт данные один раз в том же виде, что юзер их отправлял - то что показывается юзеру, это уже переделанное на ХТМЛ, но исходники остаются в памяти, что бы в случае цитаты, их сразу можно было вставить, иначе же прядётся ещё более сложными регулярками их парсить обратно - Страница сайта полностью на JS и не перегружается, гонять несколько раз данные, чтоб сначала уже в ХТМЛ а для правки ещё раз в ББкоде -> траффик - С одной стороны да - мы грузим бруазер юзеру, с другой разгружаем свои сервера лишней работой. Добавлено через 14 минут и 44 секунды В том то и проблема, что они могут быть не пустыми, я скорее о такой конструкции:
То есть, после первой замены внутренней цитаты, там в строке будет див, тем самым внешняя цитата по логике регулярки пустой не будет, а мне надо, чтоб она игнорировалась, в связи с тем, что кроме самих цитат внутри, там пустота вокруг. |
Автор: ksnk 14.7.2013, 19:09 |
Для таких случаев проще мскать и менять именно такие двойные комбинации: 2x открытые+ 2x закрытые . А есть ли смысл менять именно квотирование? Может так и надо, типа это ответ на ответ с квотированием? |
Автор: Arantir 14.7.2013, 19:15 | ||||||
Тогда добавьте третью регулярку:
и вот это
А для морального удовлетворения вынести подобные регулярки в функцию cleanup() и вызывать ее перед code_to_html() =) |
Автор: animegirl 14.7.2013, 19:16 | ||
ksnk, Так там не будет двойных, там в итоге внутри будет уже див, см. выше рекурсивность из внутри наружу будет идти. А менять двойные не выход, ведь текст может быть либо до либо после. По-поводу второго пункта, цитирование цитаты это как бы то, что мы добивались вчера, и это устраивает, но предполагается, что человек не будет составлять весь свой пост из банального цитирования, а тем более, что цитирующий будет цитировать пост состоящий тупо из цитирования. В довесок, эти все извращения делаются только для безымянного цитирования, в цитирование с указанием автора, я так свирепствовать не буду ) Добавлено через 2 минуты Arantir, А во что тогда превратится такое:
![]() Добавлено через 3 минуты и 47 секунд Я уже не плохо себе голову поломала над этими всеми вариантами, варианты, я продумала досконально, мне бы теперь регулярку подправить как надо, а не по новой передумывать как сделать, у меня почему-то детект дива с атрибутами и текстом не работает (, а именно вот этот момент в регулярке: /\[quote\]([^\[quote\]]|^[.*]^[^<div.*>.*<\/div>]*?$|.*?)\[\/quote\]/igm, Добавлено через 5 минут и 17 секунд Русским языком примерно так: Ничего не делать, если попадается внутри [цитата], так же ничего не делать если попадается внутри див с атрибутами но без текста по бокам, преобразовывать, только если внутри любой другой текст. |
Автор: AVA12 14.7.2013, 22:05 |
Угу. "Now they have two problems". Пытаться распарсить произвольные вложенные теги с помощью единственного регвыра - задача изначально обреченная. Обязательно найдется пример, способный сломать самый хитрозакрученный регвыр. И как быть, если юзер ввел некорректный текст (например, закрыл теги не в том порядке)? Так что только синтаксический анализатор, как подсказывает ksnk. |
Автор: animegirl 14.7.2013, 22:09 | ||
Пытаюсь представить вариант, в голове, но не получается понять, о чём вы, можно пример? |
Автор: ksnk 14.7.2013, 23:04 | ||
пример неправильного форматирования?
в этом случае (при квотировании потерян b и i) При этом регулярки сделают болдом весь квотированный текст, что, наверное, правильно, но и текст после него, что видимо, неправильно. При "обычном" (в моем понимании ![]() Если парсить регулярками, и откорректировать и диагностировать ошибки затруднительно. Нужно писать дополнительные регулярки, как с пустым квотированием ... |
Автор: animegirl 14.7.2013, 23:07 | ||||||||
Прочитала - не поверила, запихнула в своё форму, прогнала - как я и предполагала, регулярка их просто игнорирует, так как нету закрывающих тэгов Добавлено через 2 минуты и 33 секунды
Вы переоцениваете мою прогибчивость перед юзером. У меня политика такова: Неправильно использовал, увидишь косячную прорисовку - задумаешься, отредактируешь, будет выглядеть нормально. Я же всё-таки не няньку юзеру программирую. Добавлено через 6 минут и 47 секунд Из выше написанного прямо вытекает: Моя задача продумать прорисовку, косяки юзер пускай исправляет сам. Задумалась. Ок, да отслеживание с дивами, это я походу всё-таки в няньку ударилась, но тут скорее возможность именно того, что юзер заквотит другого юзера, который скосячил. Как-то так. Да и вообще, дискуссия ушла от темы слишком далеко, как мне конкретную вещь отловить регуляркой? А именно:
ну, чтоб так же работало как с
|
Автор: animegirl 26.7.2013, 20:53 | ||||||||
Моя эпопея не закончена, оставила лазейки для XSS, надо бы заделать. Было
сделала
Текст такого вида:
Удачно отсеивается, а вот
делает своё гадкое дело. ( Не могу понять, почему не работает отрицание. Можете подправить? |
Автор: Arantir 26.7.2013, 23:21 | ||
По русски: ИЛИ [что угодно, кроме кавычек], ИЛИ [все что угодно] Запихивая туда текст с кавычками, конечно же, побеждает вторая половинка выражения. Вероятно, имелось ввиду
|