You don't use the good function to do that for several reasons, I suggest you to use preg_replace_callback instead. Example:
$source = file_get_contents($yourfile);
$pattern = '~#[[:xdigit:]]{3}(?:[[:xdigit:]]{3})?~';
$count = 0;
$output = preg_replace_callback($pattern,
function ($m) use (&$count) { return '@var' . ++$count; },
$source);