从标签的最后一次出现开始正则表达式

Start regex from the last occurrence of a tag

我正在尝试使用 REGEX 识别 bbcodes 内部文本。

我有以下文字:

Lorem ipsum dolor sit amet, [color] consectetur adipisicing el it labore et [color=red]dolore magna aliqua[/color] minim veniam.

目前我正在使用这种模式:

/\[([a-z0-9]+).+?\[\/\]/i

但它抓住了这个:

[color] consectetur adipisicing el it labore et [color=red]dolore magna aliqua[/color]

而不是这个:

[color=red]dolore magna aliqua[/color]

我正在考虑两种解决方案,但我不知道如何实现:

  1. 不允许标签内容中包含标签。然后,[b]this [b] won't be allowed[/b];
  2. 从最后一次出现的标记开始模式。

感谢您的帮助,

JG

你的正则表达式找到最左边出现的 [ 后跟 BBtag,然后 .+? 匹配除换行符之外的任何 1+ 个字符,尽可能少,但尽可能多最左边的 [/<CLOSE_TAG>].

您需要确保在通往结束标签的过程中不匹配开始标签:

\[([a-z0-9]+)[^\[]*(?:\[(?!\b)[^\[]*)*?\[\/\]

regex demo

它几乎与 \[([a-z0-9]+)(?:(?!\[\b).)+?\[\/\] 相同,可能更具可读性,但效率较低。

详情:

  • \[ - 左括号
  • ([a-z0-9]+) - 第 1 组(标签名称):1+ 个字母数字符号
  • [^\[]* - [
  • 以外的零个或多个字符
  • (?:\[(?!\b)[^\[]*)*? - 0+序列(越少越好)匹配
    • \[(?!\b) - [ 后面没有作为整个单词的第 1 组文本
    • [^\[]* - [
    • 以外的零个或多个字符
  • \[ - 一个 [
  • \/ - 一个/
  • </code> - 第 1 组文本</li> <li><code>\] - ].