如何在PHP中解析sprintf字符串

Consider a typical structure created by sprintf as

$pattern = "%1$s-%2$s|%3$s";
$str = sprintf($pattern, $a, $b, $c);

now we have a string as test-fore|here

How we can parse the latter string by using the sprintf pattern to get the values of $a, $b, and $c.

An attempt using regular expressions:

function sscanfAlt($format, $str){

  // split string by %s, %d, %2$s etc.
  // note that this regex doesn't handle some identifiers
  // like precision or padding
  $parts = preg_split('/(%(?:\d\$)?[bcdeEufFgGosxX])/', $format, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

  // odd entries = format directives; even entries = normal text
  foreach($parts as $idx => &$value)
    $value = ($idx & 1) ? preg_quote($value, '/') : '(.*)';

  // rebuild as regex
  preg_match('/' . implode('', $parts) . '/', $str, $matches);
  array_shift($matches);
  return $matches;
}  

Use like:

$values = sscanfAlt('%1$s-%2$s|%3$s', 'test-fore|here');