phpregexpreg-replacebackreference

Named backreferences with preg_replace


Pretty straightforward; I can't seem to find anything definitive regarding PHP's preg_replace() supporting named backreferences:

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

This is a trivial example, but I'm wondering if this syntax, (?P=name) is simply not supported. Syntactical issue, or non-existent functionality?


Solution

  • They exist:

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

    With preg_replace_callback:

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

    Or even quicker:

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

    Also, for the first way, you can use the group name inline like this:

    $newandimproved 
        = preg_replace_callback('#^user/(?P<id>[^/]+)$#Di', '/user/profile/$id', $string);
    

    With $ you can catch group id and Group Name.