BBCode - 正则表达式仅匹配属性上的任何引号或两个引号



我正在尝试构建一个与BBCode属性匹配的正则表达式。我希望它匹配不带引号的属性(attr=value)以及它们(attr="value"),但如果只有一个标记(attr="valueattr=value"),则不匹配。

我设法使用这个正则表达式/[size=((?=")"(.*?)"|([^"]*))](.*?)[/size]/is(用于大小标签)接近解决方案,使用前瞻,但它将带引号和未带引号的属性的匹配放在不同的索引上。这是一个方案:

+-----------------------+----------+----------+----------+----------+
| Input                 | Match #1 | Match #2 | Match #3 | Match #4 |
+-----------------------+----------+----------+----------+----------+
| [size="7"]txt[/size]  | "7"      | 7        |          | txt      |
+-----------------------+----------+----------+----------+----------+
| [size=7]txt[/size]    | 7        |          | 7        | txt      |
+-----------------------+----------+----------+----------+----------+

虽然这不是一个主要问题,但我想知道是否有任何方法将它们与同一索引匹配。

背景信息:

基本上,我正在努力改进BBCode解析器。至于现在,它只允许放置不带引号的属性 " .现在,这给它带来了很多限制,所以我正在添加对引用属性的支持。问题是我无法破坏向后兼容性,所以我必须想出一些适用于这两种情况的东西。

由于与第一个案例匹配的组必须与匹配第二个案例的组不同,因此我认为没有任何方法可以使它们匹配到相同的索引/组。

不过,看到代码像下面这样工作并不罕见:

attr = matches[1] or matches[2]

由于您可以确定这些元素中最多有一个是非空的,因此or逻辑有效。

最新更新