1

我正在尝试构建一个匹配 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      |
+-----------------------+----------+----------+----------+----------+

虽然这不是一个主要问题,但我想知道是否有任何 wya 可以将它们匹配到相同的索引。

背景资料:

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

4

1 回答 1

1

由于与您的第一种情况匹配的组必须与与第二种情况匹配的组不同,我不相信有任何方法可以让它们与相同的索引/组匹配。

但是,看到像下面这样解决这个问题的代码并不罕见:

attr = matches[1] or matches[2]

由于您可以肯定地知道这些元素中最多有 1 个是非空的,因此or逻辑有效。

于 2012-12-18T02:05:49.410 回答