0

bbCode のように動作するカスタム関数を作成しました。preg_replace と正規表現を使用しています。唯一の問題は、複数の bbCode フォーマットを使用すると、1 つしか機能しないことです..

[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

すべてのタグをペアではなくシングルとして扱う

$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 に答える
0

@nickbが述べたように、あなたのパターンは貪欲です。(.*)すべてをつかみます。に変更してみてください(.*?)

于 2012-07-17T13:52:09.260 に答える