BBCode - 正则表达式只匹配属性上没有或两个引号

时间:2012-12-08 02:18:00

标签: php regex 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      |
+-----------------------+----------+----------+----------+----------+

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

背景信息:

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

1 个答案:

答案 0 :(得分:1)

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

看到代码解决这个问题并不罕见,如下所示:

attr = matches[1] or matches[2]

由于您可以确定这些元素中至多有一个非空,因此or逻辑可以正常工作。