![]() |
Модераторы: 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 секунды В том то и проблема, что они могут быть не пустыми, я скорее о такой конструкции:
То есть, после первой замены внутренней цитаты, там в строке будет див, тем самым внешняя цитата по логике регулярки пустой не будет, а мне надо, чтоб она игнорировалась, в связи с тем, что кроме самих цитат внутри, там пустота вокруг. -------------------- Скажи миру - НЯ! |
||||
|
|||||
![]() ![]() ![]() |
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |