Я пытаюсь сделать движок на основе bbcode для своего веб-сайта. Но дело в том, что непонятно, какие коды доступны, потому что коды делают пользователи. И вдобавок ко всему, все это должно быть рекурсивным.
Например:
Hello my name is [name user-id="1"]
I [bold]really[/bold] like cheeseburgers
Это самые простые, и я добился того, чтобы они работали.
Теперь проблема в том, что происходит, когда два из этих кодов находятся друг за другом:
I [bold]really[/bold] like [bold]cheeseburgers[/bold]
Или внутри друг друга
I [bold]really like [italic]cheeseburgers[/italic][/bold]
Эти коды также могут иметь атрибуты
I [bold strengh="600"]really like [text font-size="24px"]cheeseburgers[/text][bold]
Следующий работал довольно хорошо, но ему не хватало рекурсивной части (?R)
(?P<code>\[(?P<code_open>\w+)\s?(?P<attributes>[a-zA-Z-0-1-_=" .]*?)](?:(?P<content>.*?)\[\/(?P<code_close>\w+)\])?)
Я просто не знаю, куда поставить рекурсивный тег (?R).
Также система должна знать, что в этой строке здесь
I [bold]really like [italic]cheeseburgers[/italic][/bold] and [bold]football[/bold]
являются 2 "кодовыми объектами":
1. [bold]really like [italic]cheeseburgers[/italic][/bold]
и
2. [bold]football[/bold]
... и содержание первого
really like [italic]cheeseburgers[/italic]
в котором снова есть код
[italic]cheeseburgers[/italic]
какой контент
cheeseburgers
Я искал в Интернете в течение двух дней, и я не могу понять это.
Я подумал о чем-то вроде этого:
- Найдите что-то вроде [**** attr="foo"] с необязательными атрибутами и сохраните их в группе захвата.
- Посмотрите, есть ли где-нибудь закрывающий тег (также может быть необязательным)
- Если существует закрывающий тег, все, что находится между двумя тегами, должно быть сохранено как группа захвата «контента», которая затем должна снова пройти ту же процедуру.
Я надеюсь, что есть специалисты по регулярным выражениям, которые готовы мне помочь. :(
Спасибо!
ИЗМЕНИТЬ
Поскольку это может быть трудно понять, вот ввод и ожидаемый вывод:
Вход:
[heading icon="rocket"]I'm a cool heading[/heading][textrow][text]<p>Hi!</p>[/text][/textrow]
Я хотел бы иметь массив, например
array[0][name] = heading
array[0][attributes][icon] = rocket
array[0][content] = I'm a cool heading
array[1][name] = textrow
array[1][content] = [text]<p>Hi!</p>[/text]
array[1][0][name] = text
array[1][0][content] = <p>Hi!</p>
(?R)
, но мне очень любопытно, как... вы можете попробовать что-то с этим шаблоном:(?s)\[(?!\/)([^\s\]]+)[^]]*\](.*?)\[\/\1\]
- person   schedule 22.12.2015RegularParser
. - person Tomasz Kowalczyk   schedule 29.12.2015