【问题标题】:Start regex from the last occurrence of a tag从标签的最后一次出现开始正则表达式
【发布时间】:2017-05-30 18:52:49
【问题描述】:

我正在尝试使用 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

【问题讨论】:

    标签: regex regex-negation regex-lookarounds regex-group


    【解决方案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 组文本
    • \] - 一个]

    【讨论】:

    • 哇!非常感谢!它工作得很好!我试图找到一个不起作用的案例,但我找不到任何人:-) 太棒了!谢谢!
    猜你喜欢
    • 2012-01-12
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多