![]() |
Модераторы: Sardar, Aliance |
![]() ![]() ![]() |
|
animegirl |
|
||||||||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
В своей работе, использую функцию по перекодированию ббкод тэгов в обычные ХТМЛ тэги, проблема в том, что некоторые вложенные тэги создают ошибки.
Моя функция:
Если сделать вложенное цитирование, например так
то я в итоге получаю блок цитаты с
внутри и
снаружи. Как мне подправить мою функцию, чтобы она могла разбирать вложенные тэги, без таких коллизий? ![]() -------------------- Скажи миру - НЯ! |
||||||||
|
|||||||||
Arantir |
|
||||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 14 Всего: 55 |
Для начала - не использовать ленивые выражения для допускающих вложенность тегов.
Точка - любой символ. Так что
После этого получится
Лучше будет сделать для тегов с вложенностью отдельною функцию замены и взвывать ее рекурсивно для найденной группы. Это сообщение отредактировал(а) Arantir - 13.7.2013, 20:52 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||
|
|||||
animegirl |
|
|||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
Arantir,
Колдую над регуляркой, хочу её подправить, там где вы правильно указали, вместо "любой символ", хочу сделать "любой символ, кроме [цитата]", чё-то как не кручу, результат нулевой, хотя бы внутренняя цитаты обработалась бы, уже было чуток проще ( Добавлено через 29 секунд
-------------------- Скажи миру - НЯ! |
|||
|
||||
Arantir |
|
|||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 14 Всего: 55 |
А почему бы просто не заменить все [quоte] на <div class="quote_div">, а все [/quоte] на </div>?
![]()
Это ломает всю идею. Регулярке на другие [quоte] и так наплевать. В ней же они только по одному разу указаны, один раз она их и найдет - самую ближнюю и самую дальнюю, а между ними - все, что угодно. Суть идеи была в том, чтобы вот это все между ними пропустить через замену еще раз. И так пока там не останется в ни одной [quоte] в очередном вхождении. -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
animegirl |
|
|||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
Arantir,
Долго пыталась понять "А реально, почему бы и нет?", а потом поняла, да очень просто, если юзер не закроет тэг, он сможет сломать весь вид. А это раздолье для вандалов. Добавлено через 1 минуту и 15 секунд Arantir, По поводу ломки идеи, как раз таки нет, я поставлю процесс на рекурсию, и выходом будет тот факт, что строка не изменила свой вид. -------------------- Скажи миру - НЯ! |
|||
|
||||
Arantir |
|
||||||||||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 14 Всего: 55 |
Для этого не обязательно
Например, для строки
Это сообщение отредактировал(а) Arantir - 13.7.2013, 22:45 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||||||||
|
|||||||||||
animegirl |
|
|||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
Arantir,
Не поняла, почему? Вот как я вижу эту рекурсию:
Это сообщение отредактировал(а) animegirl - 13.7.2013, 23:02 -------------------- Скажи миру - НЯ! |
|||
|
||||
Arantir |
|
||||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 14 Всего: 55 |
В физическом представлении моя доселе неосязаемая идея выглядит так:
Тест:
Это сообщение отредактировал(а) Arantir - 13.7.2013, 23:02 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||
|
|||||
animegirl |
|
||||||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
В вашем примере выводятся 2 ошибки, которые неприемлемы логике вложеных тэгов, а именно в примерах
там выдаётся
хотя должно выглядеть так:
Добавлено через 1 минуту и 25 секунд Так в итоге, как переделать строку /\[quote](.*?)\[\/quote\]/igm, что бы там по середине исключалось открывание тэга [цитата]? -------------------- Скажи миру - НЯ! |
||||||
|
|||||||
Arantir |
|
||||||||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 14 Всего: 55 |
Это бы прокатило и с обычным вариантом:
Просто с ним бы заменяло снаружи внутрь, а у Вас изнутри наружу. Мой вариант ищет крайние внешние, а Ваш - самые внутренние (которые без вложений). В обоих случаях постоянная замена в конце концов все позаменяет. Мой вариант с рекурсией лишь не ищет в лишнем тексте и не сравнивает его весь целиком.
![]() Добавлено через 9 минут и 7 секунд
Ну, вообще-то, после парсинга это уже не теги, а просто буковки в HTML-коде. В любом случае скрипт не может наверняка узнать, в каком именно месте пропущен тег. А что, если я пропустил его перед тройкой, а не перед ноликов, и так как у Вас быть не должно? =) Да и вообще:
Это сообщение отредактировал(а) Arantir - 13.7.2013, 23:16 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||||||
|
|||||||||
animegirl |
|
||||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
Arantir,
приводит к той ошибке, что внутрений тэг меняется, а последующие внешние - нет. там надо сделать "не тэг цитаты И чтоб хотя бы один знак любой" Добавлено через 13 минут и 25 секунд Arantir, Готово, спасибо за пинание извилин в правильном направление ;) f
Логика регулярок для меня всё равно остаётся на уровне бизона хигинса, но задача выполняется как надо ) -------------------- Скажи миру - НЯ! |
||||
|
|||||
animegirl |
|
|||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
Пытаюс добавить туда отказ обработки пустых цитат, на ум пришло сделать так:
но на деле не работает ( -------------------- Скажи миру - НЯ! |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
animegirl, Парсинг bb - не самая простая задача. Для сложных вложенных тегов с параметрами, вообще говоря - комплектом регулярок не решается. Обычно, такое делается, используя "автомат со стеком". Выедается открывающий тег, укладывается на стек, когда встречается закрывающий тег - со стека берется последний открытый и с этой парой уже идет трансформация...
На phpclub (внезапно? ![]() Другое дело, нужен ли парсер на JS или его уместнее делать на сервере? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
Arantir |
|
||||||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 14 Всего: 55 |
Иногда проще разбить сложную задачу на подзадачи. У пользователей компы не бесконечно мощные, пожалейте их немножко
![]() Можно перед обработкой просто удалять все пустые \[quote\]. Заменять
А что останется - уже парсить в HTML. Добавлено через 8 минут и 11 секунд
Да, кстати, во многих форумных движках так и делается.
Может это просто WYSIWYG. В том числе, способ разгрузить сервер. А раз не сервер - сверхэффективный алгоритм делать не обязательно. -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||||
|
|||||||
animegirl |
|
||||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
Нужен на JS, причины: - сервер передаёт данные один раз в том же виде, что юзер их отправлял - то что показывается юзеру, это уже переделанное на ХТМЛ, но исходники остаются в памяти, что бы в случае цитаты, их сразу можно было вставить, иначе же прядётся ещё более сложными регулярками их парсить обратно - Страница сайта полностью на JS и не перегружается, гонять несколько раз данные, чтоб сначала уже в ХТМЛ а для правки ещё раз в ББкоде -> траффик - С одной стороны да - мы грузим бруазер юзеру, с другой разгружаем свои сервера лишней работой. Добавлено через 14 минут и 44 секунды В том то и проблема, что они могут быть не пустыми, я скорее о такой конструкции:
То есть, после первой замены внутренней цитаты, там в строке будет див, тем самым внешняя цитата по логике регулярки пустой не будет, а мне надо, чтоб она игнорировалась, в связи с тем, что кроме самих цитат внутри, там пустота вокруг. -------------------- Скажи миру - НЯ! |
||||
|
|||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Для таких случаев проще мскать и менять именно такие двойные комбинации: 2x открытые+ 2x закрытые .
А есть ли смысл менять именно квотирование? Может так и надо, типа это ответ на ответ с квотированием? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
Arantir |
|
||||||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 14 Всего: 55 |
Тогда добавьте третью регулярку:
и вот это
А для морального удовлетворения вынести подобные регулярки в функцию cleanup() и вызывать ее перед code_to_html() =) -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||||
|
|||||||
animegirl |
|
|||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
ksnk,
Так там не будет двойных, там в итоге внутри будет уже див, см. выше рекурсивность из внутри наружу будет идти. А менять двойные не выход, ведь текст может быть либо до либо после. По-поводу второго пункта, цитирование цитаты это как бы то, что мы добивались вчера, и это устраивает, но предполагается, что человек не будет составлять весь свой пост из банального цитирования, а тем более, что цитирующий будет цитировать пост состоящий тупо из цитирования. В довесок, эти все извращения делаются только для безымянного цитирования, в цитирование с указанием автора, я так свирепствовать не буду ) Добавлено через 2 минуты Arantir, А во что тогда превратится такое:
![]() Добавлено через 3 минуты и 47 секунд Я уже не плохо себе голову поломала над этими всеми вариантами, варианты, я продумала досконально, мне бы теперь регулярку подправить как надо, а не по новой передумывать как сделать, у меня почему-то детект дива с атрибутами и текстом не работает (, а именно вот этот момент в регулярке: /\[quote\]([^\[quote\]]|^[.*]^[^<div.*>.*<\/div>]*?$|.*?)\[\/quote\]/igm, Добавлено через 5 минут и 17 секунд Русским языком примерно так: Ничего не делать, если попадается внутри [цитата], так же ничего не делать если попадается внутри див с атрибутами но без текста по бокам, преобразовывать, только если внутри любой другой текст. -------------------- Скажи миру - НЯ! |
|||
|
||||
AVA12 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 4.5.2008 Репутация: 2 Всего: 4 |
Угу. "Now they have two problems".
Пытаться распарсить произвольные вложенные теги с помощью единственного регвыра - задача изначально обреченная. Обязательно найдется пример, способный сломать самый хитрозакрученный регвыр. И как быть, если юзер ввел некорректный текст (например, закрыл теги не в том порядке)? Так что только синтаксический анализатор, как подсказывает ksnk. |
|||
|
||||
animegirl |
|
|||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
Пытаюсь представить вариант, в голове, но не получается понять, о чём вы, можно пример? -------------------- Скажи миру - НЯ! |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
пример неправильного форматирования?
в этом случае (при квотировании потерян b и i) При этом регулярки сделают болдом весь квотированный текст, что, наверное, правильно, но и текст после него, что видимо, неправильно. При "обычном" (в моем понимании ![]() Если парсить регулярками, и откорректировать и диагностировать ошибки затруднительно. Нужно писать дополнительные регулярки, как с пустым квотированием ... Это сообщение отредактировал(а) ksnk - 14.7.2013, 23:05 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
animegirl |
|
||||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
Прочитала - не поверила, запихнула в своё форму, прогнала - как я и предполагала, регулярка их просто игнорирует, так как нету закрывающих тэгов Добавлено через 2 минуты и 33 секунды Вы переоцениваете мою прогибчивость перед юзером. У меня политика такова: Неправильно использовал, увидишь косячную прорисовку - задумаешься, отредактируешь, будет выглядеть нормально. Я же всё-таки не няньку юзеру программирую. Добавлено через 6 минут и 47 секунд Из выше написанного прямо вытекает: Моя задача продумать прорисовку, косяки юзер пускай исправляет сам. Задумалась. Ок, да отслеживание с дивами, это я походу всё-таки в няньку ударилась, но тут скорее возможность именно того, что юзер заквотит другого юзера, который скосячил. Как-то так. Да и вообще, дискуссия ушла от темы слишком далеко, как мне конкретную вещь отловить регуляркой? А именно:
ну, чтоб так же работало как с
-------------------- Скажи миру - НЯ! |
||||
|
|||||
animegirl |
|
||||||||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
Моя эпопея не закончена, оставила лазейки для XSS, надо бы заделать.
Было
сделала
Текст такого вида:
Удачно отсеивается, а вот
делает своё гадкое дело. ( Не могу понять, почему не работает отрицание. Можете подправить? -------------------- Скажи миру - НЯ! |
||||||||
|
|||||||||
Arantir |
|
|||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 14 Всего: 55 |
По русски: ИЛИ [что угодно, кроме кавычек], ИЛИ [все что угодно] Запихивая туда текст с кавычками, конечно же, побеждает вторая половинка выражения. Вероятно, имелось ввиду
Это сообщение отредактировал(а) Arantir - 26.7.2013, 23:22 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
![]() ![]() ![]() |
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |