이 세상에 하나는 남기고 가자

이 세상에 하나는 남기고 가자

세상에 필요한 소스코드 한줄 남기고 가자

preg_replace()의 치환 문자열에서 이름이 지정된 서브 패턴의 역 참조 사용하기

유영재

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

위 예시를 봤을 때는 "굳이 복잡하게 서브 패턴에 이름을 지정해서 사용해야 하는가?" 하는 의문이 들겠지만 정규식이 복잡해 진다면 명시적으로 이름을 붙여서 사용하는 것이 유지 보수와 코드를 읽는데 도움이 된다.

서브 패턴과 역 참조에 대한 자세한 내용은 아래의 글을 참고하자.

comments powered by Disqus