0

我制作了一个类似于 bbCode 的自定义函数。我正在使用 preg_replace 和正则表达式。唯一的问题是,如果我使用不止一种 bbCode 格式,那么只有一种有效。

[align=center][img]myimagelink[/img][/align]

如果我输入这一行,那么图像也会出现 [align=center]图像[/align]。我怎样才能避免这个问题?

$patterns[2] = '@\[align=(.*)\](.*)\[\/align\]@si';
$patterns[9] = '@\[img\](.*\.jpg)\[\/img\]@si';
$replacements[2] = '<table align=\1><tr><td align=\1>\2</td></tr></table>';//ALIGN
$replacements[9] = '<img src=\"$1\"/>';//image
4

4 回答 4

2

.*表达式更改为非贪婪 ( .*?) 将对您有用。

例子:

$in = '[align=center][img]myimagelink[/img][/align]';
$patterns = array(
    '~\[align=(left|right|center)\](.*?)\[/align\]~' => '<div style="text-align: $1">$2</div>',
    '~\[img](.*?)\[/img\]~' => '<img src="$1" />',
);

$rep = preg_replace(array_keys($patterns), $patterns, $in);
echo htmlspecialchars($rep);
于 2012-07-17T13:53:01.007 回答
1

我建议不要重新发明轮子,而是使用现有的 javascript 库。

我相信 StackOverflow 使用Prettify来格式化用户输入。

于 2012-07-17T13:49:40.963 回答
0

正如@nickb 所说,你的模式是贪婪的。(.*)抓住一切。尝试将其更改为(.*?).

于 2012-07-17T13:52:09.260 回答
0

将所有标签视为单标签而不是成对标签

$patterns[2] = '@\[align=(.*)\]@si';
$patterns[3] = '@\[\/align\]@si';
$patterns[9] = '@\[img\](.*\.jpg)\[\/img\]@si';
$replacements[2] = '<div align=\"$1\">';//ALIGN
$replacements[3] = '</div>';//ALIGN
$replacements[9] = '<img src=\"$1\"/>';//image
于 2012-07-17T13:55:22.177 回答