preg_replace_callback関数を使用して実行します。
$bbcode = preg_replace_callback($match, function($matches){
// execute query
$query = "SELECT username FROM users WHERE id = '{$matches[1]}'";
// get user name
$username = $row['username']; // just for illustration.
// return formatted string.
return "<div class=\"quote\">$username said:<br />>$matches[2]</div>";
}, $str);
ああ、もっと良い方法があります。それぞれに対して SQL クエリを実行することはお勧めできません。したがって、最初にすべてのユーザー ID とコンテンツを取得します。次に、対応するすべての名前を db から取得します。
$match = "/\[quote=(.*?)\](.*?)\[\/quote\]/is";
preg_match_all($match, $str, $matches);
$query = "SELECT id, username from tbl1 where id IN (".implode(",", $matches[1]).")";
// run the query. get all the row in a hash.
$hash[$row['id']] = $hash[$row['username']];
$bbcode = preg_replace_callback($match, create_function(
'$m',
'global $hash;return "<div class=\\"quote\\">{$hash[$m[1]]} said:<br />$m[2]</div>";'
), $str);