如何修复 BBcode 正则表达式

2024-03-22

我有一个获取 BBcode 标签的正则表达式。除了一个小故障之外,它工作得很好。

这是当前的表达式:

\[([^=\[\]]+)[=\x22']*([^ \[\]]*)['\x22]*\](.+)\[/\1\]

以下是它成功匹配的一些文本及其构建的组:

[url=http://www.google.com]去 http://www.google.com%5DGo去谷歌![/url]
1:网址
2: http://www.google.com http://www.google.com
3:去谷歌!

[img]http://www.somesite.com/someimage.jpg[/img] http://www.somesite.com/someimage.jpg%5B/img%5D
1:图像
2:空
3: http://www.somesite.com/someimage.jpg http://www.somesite.com/someimage.jpg

[quote][quote]第一个嵌套引用[/quote][quote]第二个嵌套引用[/quote][/quote]
1:报价
2:空
3: [quote]第一个嵌套引用[/quote][quote]第二个嵌套引用[/quote]

所有这一切都很棒。我可以通过针对相同的正则表达式运行第三个匹配组来处理嵌套标签,并递归地处理所有嵌套的标签。问题在于使用 [quote] 标签的示例。请注意,第三个匹配组是一组两个引号标记,因此我们期望有两个匹配。然而,我们得到了一场比赛,如下所示:

[quote]第一个嵌套引用[/quote][quote]第二个嵌套引用[/quote]
1:报价
2:空
3: 第一个嵌套引用[/quote][quote]第二个嵌套引用

啊啊啊!这根本不是我们想要的。有一个相当简单的方法来修复它,我修改了正则表达式:

\[([^=\[\]]+)[=\x22']*([^ \[\]]*)['\x22]*\](.+)\[/\1\]

To this:

\[([^=\[\]]+)[=\x22']*([^ \[\]]*)['\x22]*\](((?!\[/\1\]).)+)\[/\1\]

通过增加((?!\[/\1\]).)如果第三个匹配组包含结束 BBcode 标记,我们将使整个匹配无效。现在可以了,我们得到两个匹配项:

[quote]第一个嵌套引用[/quote][quote]第二个嵌套引用[/quote]

[quote]第一个嵌套引号[/quote]
1:报价
2:空
3:第一个嵌套引用

[quote]第二个嵌套引号[/quote]
1:报价
2:空 3:第二个嵌套引用

我很高兴解决了这个问题,但现在我们遇到了另一个问题。这个新的正则表达式在第一个正则表达式中失败,我们将两个引号标签嵌套在一个更大的引号标签下。我们得到两场比赛而不是一场:

[quote][quote]第一个嵌套引用[/quote][quote]第二个嵌套引用[/quote][/quote]

[quote][quote]第一个嵌套引号[/quote]
1:报价
2:空
3: [quote]第一个嵌套引号

[quote]第二个嵌套引号[/quote]
1:报价
2:空
3:第二个嵌套引用

第一场比赛全部错误,第二场比赛虽然形式良好,但并不是理想的比赛。我们想要一个大匹配,第三个匹配组是两个嵌套的引号标签,就像我们使用第一个表达式时一样。

有什么建议么?如果我能跨越这个差距,我应该有一个相当强大的 BBcode 表达式。


Using 平衡组 http://msdn.microsoft.com/en-us/library/bs2twtah.aspx#balancing_group_definition你可以构造一个像这样的正则表达式:

(?>
  \[ (?<tag>[^][/=\s]+) \s*
  (?: = \s* (?<val>[^][]*) \s*)?
  ]
)

(?<content>
  (?>
    \[(?<innertag>[^][/=\s]+)[^][]*]
    |
    \[/(?<-innertag>\k<innertag>)]
    |
    [^][]+
  )*
  (?(innertag)(?!))
)

\[/\k<tag>]

根据Kobi的例子进行简化。


在下面的:

[foo=bar]baz[/foo]
[b]foo[/b]
[i][i][foo=bar]baz[/foo]foo[/i][/i]
[i][i][i][i]foo[/i][/i][/i][i][i]foo[/i][/i][/i]
[quote][quote][b][img]foo[/img][b]bold[/b][b][b]deep[/b][/b][/b][/quote]bar[quote]baz[/quote][/quote]

它找到这些匹配项:

  • [foo=bar]baz[/foo]
  • [b]foo[/b]
  • [i][i][foo=bar]baz[/foo]foo[/i][/i]
  • [i][i][i][i]foo[/i][/i][/i][i][i]foo[/i][/i][/i]
  • [quote][quote][b][img]foo[/img][b]bold[/b][b][b]deep[/b][/b][/b][/quote]bar[quote]baz[/quote][/quote]

完整示例位于http://ideone.com/uULOs http://ideone.com/uULOs

(旧版http://ideone.com/AXzxW http://ideone.com/AXzxW)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修复 BBcode 正则表达式 的相关文章

  • 如何自定义 ASP.Net Core 模型绑定错误?

    我只想从我的 Web API Asp net Core 2 1 返回标准化的错误响应 但我似乎不知道如何处理模型绑定错误 该项目刚刚从 ASP NET Core Web 应用程序 gt API 模板创建 我有一个简单的操作定义为 Route
  • ASP.NET Core 中 AsNoTracking 的模拟或更好的解决方法

    您如何模拟 AsNoTracking 或者是否有更好的解决方法来解决此问题 Example public class MyContext MyContextBase Constructor public MyContext DbContex
  • 是否返回 std::move (x)?

    Are std vector
  • 是否可以获取指向装箱非托管值类型的指针?

    是否可以获取指向装箱非托管值类型的指针 而无需编写对每个支持的类型进行强制转换的大型 switch 语句 就像是 object val Contains a boxed unmanaged value such as int long by
  • 在 C++ 中初始化指针

    可以在声明时将指针分配给值吗 像这样的东西 int p 1000 是的 您可以在声明时初始化指向值的指针 但是您不能这样做 int p 1000 是个地址运算符 并且您不能将其应用于常量 尽管如果可以 那会很有趣 尝试使用另一个变量 int
  • 二维数组的列求和

    我有一个IEnumerable
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • 使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理

    如何使用 C 和 NET Core 3 x 管理 AWS Cognito 用户池中的用户 在文档中找不到有关它的任何内容 Attilio Gelosa 的原创文章 我写这篇文章是希望对其他人有帮助 我必须阅读一页又一页的文档 并从 AWS
  • 如何将对 System.Data.DataSetExtensions 的引用添加到网站 ascx.cs 文件?

    我们正在处理一个网站项目并尝试参考System Data DataSetExtensions 使用 Web 应用程序会更好 不过 技术主管有她的理由 这是我们尝试过的 找到装配路径 打开 Visual Studio 命令提示符并运行sn e
  • 运行 Aero 时如何确定实际窗口窗体大小(包含所有非客户端元素)?

    我试图将我的表单精确定位在任务栏上方 不幸的是 我的努力受到了以下事实的阻碍 this Height在我的表单上返回一个比实际表单 包含所有边框 标题栏等 小 10 像素的值 我正在运行带 Aero 的 Windows 7 当 Aero 关
  • 当 C 中没有足够的内存用于静态分配时会发生什么?

    当您动态分配内存时 例如malloc 1024 sizeof char 结果指针设置为NULL如果没有足够的可用内存来满足请求 当没有足够的内存来满足静态分配时会发生什么 例如char c 1024 char c 1024 不一定是静态分配
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • Silverlight 4 PLINQ

    我有一个非常简单的问题 是否可以将 PLINQ 与 Silverlight 4 一起使用 因为它似乎不存在于最常引用的程序集中 它不受支持 但您可以在这里投票 http dotnet uservoice com forums 4325 si
  • std::iota 的 iota 代表什么?

    我假设 i 是增量 a 是分配 但我无法弄清楚或找到答案 而且 它看起来与非标准非常相似itoa我认为这很令人困惑 C iota is not an acronym or an initialism It is the word iota
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • 使texture2D在运行时/脚本Unity3D中可读[重复]

    这个问题在这里已经有答案了 我有一个插件 可以让我访问 Android 手机图库中的图片 这给了我一个Texture2D类型的纹理 然后我想使用 GetPixels 函数对其进行编辑 但默认情况下它未设置为可读 如何使纹理可读 以便我可以在
  • 如何在您的网站中连接两个人

    有一款名为 Verbosity 的游戏 这是一款有目的的游戏 位于此链接上www gwap com 在游戏中 他们随机连接两个玩家互相玩 游戏是玩家1应该向他的搭档 玩家2 描述一个单词 而玩家2应该猜测这个单词 我正在尝试建立一个网站来执
  • 从“class”名称中删除/替换不需要的前缀信息

    我正进入 状态style从后端 它带有不需要的前缀 我会替换没有前缀的相同内容 正确的方法是什么 这就是我得到的
  • C# 中的快速字符串解析

    在 C 中解析字符串最快的方法是什么 目前我只是使用字符串索引 string index 并且代码运行合理 但我忍不住认为索引访问器所做的连续范围检查必须添加一些东西 所以 我想知道我应该考虑哪些技术来增强它 这些是我最初的想法 问题 使用
  • 使用 Crypto++ 和 .NET 的 CFB 模式下的 TripleDES

    我正在尝试使用 TripleDES 使用 C 应用程序获得相同的结果 该应用程序具有Crypto https www cryptopp com 和 NET应用程序使用三重DESCryptoServiceProvider https msdn

随机推荐