preg_replace()는 이름이 지정된 서브 패턴에 대한 역 참조(named backreferences)를 지원하지 않는다.
일단 일반적인 역 참조를 사용하는 방법에 대한 예시를 보자.
<?php
$string = 'user/foo';
echo preg_replace('/^user\\/(?P<id>[^\\/]+)$/', 'user/profile/\\1', $string);
// user/profile/foo
위의 예시에서 치환 문자열의 \\1
대신에 패턴에서 지정된 이름("id")을 사용하고자 한다고 가정하자.
<?php
$string = 'user/foo';
echo preg_replace('/^user\\/(?P<id>[^\\/]+)$/', 'user/profile/\\id', $string);
user/profile/\id
결과에서 보듯이 역 참조는 패턴에서 지정된 이름으로는 사용할 수 없다. 이런 경우라면 아래와 같이 preg_replace_callback()을 사용해야 한다.
$string = 'user/foo';
echo preg_replace_callback('/^user\\/(?P<id>[^\\/]+)$/', function ($matches) {
return 'user/profile/' . $matches['id'];
}, $string) . "\n";
// user/profile/foo
위 예시를 봤을 때는 "굳이 복잡하게 서브 패턴에 이름을 지정해서 사용해야 하는가?" 하는 의문이 들겠지만 정규식이 복잡해 진다면 명시적으로 이름을 붙여서 사용하는 것이 유지 보수와 코드를 읽는데 도움이 된다.
서브 패턴과 역 참조에 대한 자세한 내용은 아래의 글을 참고하자.