我正在尝试构建一个与BBCode属性匹配的正则表达式。我希望它匹配不带引号的属性(attr=value
)以及它们(attr="value"
),但如果只有一个标记(attr="value
或attr=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
逻辑有效。