2017-05-30 89 views
1

我试图用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]+).+?\[\/\1\]/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

回答

1

你的正则表达式查找的[最左边出现其次是BBtag,然后.+?匹配任何1+比换行符尽可能少的其他字符,但尽可能多地找到最左边的[/<CLOSE_TAG>]

你需要确保你不要在路上开始标签匹配到收盘之一:

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

regex demo

这几乎是一样的\[([a-z0-9]+)(?:(?!\[\1\b).)+?\[\/\1\]可能会有点更具可读性,但效率较低。

详细

  • \[ - 开括号
  • ([a-z0-9]+) - 第1组(标签名):1+字母数字符号
  • [^\[]* - 零个或多个字符以外[
  • (?:\[(?!\1\b)[^\[]*)*? - 0+序列(尽可能少)匹配
    • \[(?!\1\b) - 一个[后面没有与第1组文本作为一个整体字
    • [^\[]* - 比[
  • \[其他零个或多个字符 - 一个[
  • \/ - 一个/
  • \1 - 第1组文本
  • \] - a ]
+1

WOW!非常感谢!它非常完美!我试图找到一个案件,它不工作,但我找不到任何人:-)太棒了!谢谢! –

相关问题