从最后一次出现标记开始执行正则表达式
问题描述:
我试图用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]
我正在考虑两种解决方案,但我不知道如何使它发挥作用:
- 标签内容的内侧未被允许的标签。然后,
[b]this [b] won't be allowed[/b]
; - 从最后一个标记发生处开始模式。
感谢您的帮助,
JG
答
你的正则表达式查找的[
最左边出现其次是BBtag,然后.+?
匹配任何1+比换行符尽可能少的其他字符,但尽可能多地找到最左边的[/<CLOSE_TAG>]
。
你需要确保你不要在路上开始标签匹配到收盘之一:
\[([a-z0-9]+)[^\[]*(?:\[(?!\1\b)[^\[]*)*?\[\/\1\]
这几乎是一样的\[([a-z0-9]+)(?:(?!\[\1\b).)+?\[\/\1\]
可能会有点更具可读性,但效率较低。
详细:
-
\[
- 开括号 -
([a-z0-9]+)
- 第1组(标签名):1+字母数字符号 -
[^\[]*
- 零个或多个字符以外[
-
(?:\[(?!\1\b)[^\[]*)*?
- 0+序列(尽可能少)匹配-
\[(?!\1\b)
- 一个[
后面没有与第1组文本作为一个整体字 -
[^\[]*
- 比[
-
-
\[
其他零个或多个字符 - 一个[
-
\/
- 一个/
-
\1
- 第1组文本 -
\]
- a]
。
WOW!非常感谢!它非常完美!我试图找到一个案件,它不工作,但我找不到任何人:-)太棒了!谢谢! –