我可以在脚本中添加哪些正则表达式,允许用户在其bb代码中包含可选参数?

时间:2014-03-06 01:23:55

标签: php regex bbcode

我正在用PHP编写自定义bb代码脚本。我希望能够为用户提供添加不同参数的选项,例如宽度,高度和与img标签对齐。如果你不想改变那些属性我的脚本工作正常...一旦我有正则表达式,我将如何访问这些参数,因为它们不会总是对应相同的数字($ 2),因为它们是可选的?

"'\[img\](.*?)\[\/img\]'is"

像这样的bbcode看起来像这样:

[img width=100 height=100 align=right]thelinktotheimage[/img]

更新:我试图为此编写自己的正则表达式...基本上应该只允许宽度,高度或对齐作为属性,=符号,然后是数字字符或字符串模式左,右,中间,顶部或底部作为他们的价值观。出于某种原因,正则表达式与我的测试字符串不匹配。我有一种感觉,我非常接近...我希望。有什么想法吗?

^\[img(((width|height|align)=(([0-9]+)|(left|right|middle|top|bottom)) )+)\](.*?)\[\/img\]$

2 个答案:

答案 0 :(得分:0)

因此,你可以获得很少的preg_match_all()函数,但是如果参数更多,它会变得更糟。你可以做的是例如使用这样的东西:

<?php
    $bb = "[img width=100 height=100 align=right]thelinktotheimage[/img]<br />[img width=100 height=100 align=right]thelinktotheimage[/img]";
    preg_match_all("'\[img(.{0,40})\](.*?)\[\/img\]'is", $bb, $matches);
    print_r($matches);
?>

答案 1 :(得分:0)

用正则表达式解析完全任意数量的属性是很困难的,但如果你最多只有3个(或其他一些相当小的数字),你可以使用这样的东西:

\[img (?:([a-zA-Z]+)="([a-zA-Z\d]+)")? ?(?:([a-zA-Z]+)="([a-zA-Z\d]+)")? ?(?:([a-zA-Z]+)="([a-zA-Z\d]+)")? ?].+\[\/img]

这是一个显示您将获得的匹配的链接。如您所见,奇数编号的捕获是属性名称,而evens是值。如果您不使用它们,请删除双引号。 http://regex101.com/r/bN1jT3