Как мне сопоставить все MyCode, включая вложенные теги, в регулярных выражениях? - PullRequest
0 голосов
/ 03 мая 2020

MyCode - это система форматирования на основе тегов для MyBB. Примеры форматов, относящихся к его захвату:

[quote]This is a quote[/quote]

[quote=Bob]This is a quote, [b]this bit is bold[/b], [quote] this is a nested quote [/quote][/quote]

[url=http://www.stackoverflow.com][color=#ff0000]This is an anchor with a red text color.[/color][/url]

[quote][b]
Tags can also span multiple lines.
[img]http://www.website.com/image.png[/img]
[/b]
[/quote]

До сих пор я написал регулярное выражение, которое успешно захватывает большую часть этого, но не может захватить определенные вложенные элементы. Я чувствую, что мне нужно, чтобы регулярное выражение соответствовало «внутреннему первому», но я не знаю, как это сделать (если это вообще возможно).

Например, в случае: [quote]test [b]bold[/b][/quote], ему нужно сначала проверить внутренние теги [b], затем теги [quote]. То же самое касается: [quote][quote]nested[/quote][/quote]

Вот что я написал до сих пор, я прокомментировал это, чтобы помочь объяснить.

\[(.*?)(=[^]]+)?]([\s\S]*?)\[\/\1]

annotated picture of matching groups

https://regex101.com/r/emNAh2/1

1 Ответ

1 голос
/ 03 мая 2020

Хотя технически правильно, строго говоря, вы не можете использовать здесь регулярные выражения, это скорее неправильное утверждение, чем правильное. Очень немногие языки имеют строго регулярную реализацию регулярных выражений, и у самой популярной библиотеки регулярных выражений (PCRE) нет проблем с этой задачей.

Теперь делать это в регулярных выражениях - ужасная идея. ReDoS, удобочитаемость, ремонтопригодность и т. Д. c. Настолько плохи с regex, что сами по себе эти проблемы могут исключить подход на основе регулярных выражений.

Но вот решение на основе регулярных выражений в любом случае: https://regex101.com/r/q0zNBU/1

...