Nombrado backreferences con preg_replace

Muy claro; Parece que no puedo encontrar nada definitivo con respecto a preg_replace() respaldando backreferences con nombre de PHP:

 // should match, replace, and output: user/profile/foo $string = 'user/foo'; echo preg_replace('#^user/(?P[^/]+)$#Di', 'user/profile/(?P=id)', $string); 

Este es un ejemplo trivial, pero me pregunto si esta syntax, (?P=name) simplemente no es compatible. ¿Problema sintáctico o funcionalidad inexistente?

    Ellos existen:

    http://www.php.net/manual/en/regexp.reference.back-references.php

    Con preg_replace_callback:

     function my_replace($matches) { return '/user/profile/' . $matches['id']; } $newandimproved = preg_replace_callback('#^user/(?P[^/]+)$#Di', 'my_replace', $string); 

    O incluso más rápido

     $newandimproved = preg_replace('#^user/([^/]+)$#Di', '/user/profile/$1', $string); 

    preg_replace no es compatible con las referencias a los nombres.

    preg_replace_callback admite backreferences con nombre, pero después de PHP 5.3, así que espere que falle en PHP 5.2 y siguientes.

    preg_replace aún no admite subpatterns con nombre.

    puedes usar esto:

     class oreg_replace_helper { const REGEXP = '~ (?\d++) ) | (?: \$\+?{(?P\w++)} ) | (?: \x5Cg\<(?P\w++)\> ) )? ~xs'; protected $replace; protected $matches; public function __construct($replace) { $this->replace = $replace; } public function replace($matches) { var_dump($matches); $this->matches = $matches; return preg_replace_callback(self::REGEXP, array($this, 'map'), $this->replace); } public function map($matches) { foreach (array('num', 'name1', 'name2') as $name) { if (isset($this->matches[$matches[$name]])) { return stripslashes($matches[1]) . $this->matches[$matches[$name]]; } } return stripslashes($matches[1]); } } function oreg_replace($pattern, $replace, $subject) { return preg_replace_callback($pattern, array(new oreg_replace_helper($replace), 'replace'), $subject); } 

    luego puede usar \g ${name} or $+{name} como referencia en su statement de reemplazo.

    cf ( http://www.rexegg.com/regex-disambiguation.html#namedcapture )