Регулярные выражения: помогите распарсить bbcode c вложенными тегами

компьютеры программирование php веб дизайн регулярные выражения

$entry = '[url=\"http://site.ru\"]<img src=\"http://img-fotki.yandex.ru/get/\" alt=\"Great Picture!\">[/url]';
preg_match ('\[url\=?\\\"?(.*[^\"])\\\"?\](.*)\[\/url\]', $entry, $matches);
даёт
matches[1] = 'http://site.ru', и этот результат соответствует ожидаемому
matches[2] = 'Great Picture!', а здесь отсутствует сам тег img c ссылкой на картинку почему-то, за исключением части "alt"

А если добавить после экранированных обратных слэшей квантификатор "?" (потому что эти слэши сами по себе - экранирование двойных кавычек в исходной строке, которых может и не быть), распознать паттерны не удаётся вовсе.

Причем, контруктор pcre.ru выдаёт несколько иной результат, более близкий к ожидаемому - квантификатор "?" можно вставить в указанные места, однако обратный слеш в результате на конце первого распарсенного паттерна всё равно почему-то остаётся (правда, эта проблема легко решаема строковыми функциями).

Как решить указанные проблемы? (Возможно, вы укажете несколько иной способ их решения). Спасибо.

Примечание:
Ой, сейчас поглядел и вспомнил, pcre прав, конечно - надо было просто добавить \\ в класс исключения[^\\\"]. Так что вторая проблема отпадает.

Примечание:
Да, я ещё разделители # в первый аргумент preg_match забыл добавить, не забудьте.

Примечание:
Вот я дурак!.. Всё верно мой код парсит, я же просто не вижу теги-то без htmlspecialchars!
Остаётся только с квантификатором "?" беда - у меня он после двух слешей губит результат напрочь, а в конструкторе зску работает.

Примечание:
И это я придумал как обойти... остался только один, относительно простой вопрос: ежели у меня открывающий ббтег только [url], код не работает. Как обойти это ограничение?

Примечание:
надо было ставить ещё один обратный слеш перед квантификатором:
#\[url\=?\\\?\"?(.*[^\\\"])\\\?\"?\](.*)\[\/url\]#
странно, но конструктору pcre этого не потребовалось.

Примечание:
>ежели у меня открывающий ббтег только [url], код не работает. Как обойти это ограничение?
Ну всё, и с этим я справился: после круглых скобок подмаски надо добавить ещё один квантификатор "?".

Чтобы добру не пропадать... признаю ответ лучшим того, кто выскажет свои более-менее правдоподобные соображения в ответ на вопрос, почему конструктору prce.ru не потребовалось дополнительного маскирующего обратного слеша перед квантификатором за двойными обратными слешами (более того, он там даже лишний). мне пока кажется, что это проблема с внутренними опциями по умолчанию в этом самом контструкторе.

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

Примечание:
crimaniak, обратные слеши вроде заэкранированые,потребовалось заэкранирова знак ?, разве нет?
Epsiloncool,
Мне интересно справляться самому, я жо в учебных целях кодю. Так что откажусь, спасибо.
Про универсальность одного парсера для всех тегов и отделённые форм-обработчики - сразу так и задумывал, просто я решил конкретизировать очередную вставшую задачу, уже двигаюсь дальше.
Ответы:
Какой у вас интересный монолог получился :)
В конструкторе pcre.ru ты вводишь маску как она есть. В коде же у тебя текстовая константа, в которой обратные слеши надо дополнительно квотить. Ты учитываешь это?
Это плохое добро. Хотите, я могу подогнать вам класс разбора phpBB-текстов, работающий рекурсивно и позволяющий на любой bb-тэг писать свой обработчик ? Работает этот парсер примерно так же, как Ваш, только он более универсален и рекурсивен (т.е. позволяет разбирать тексты с многократно вложенными bb-тэгами.
$entry = '[url=\"http://site.ru\"]<img src=\"http://img-fotki.yandex.ru/get/\" alt=\"Great Picture!\">[/url]';
Вот хорошая библиотека для работы с bb-кодами
http://forum.dklab.ru/viewtopic.php?t=36921


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.