문자열 교체를 처리 할 때 PHP는 몇 가지 강력한 도구를 제공하며, 그중 Preg_replace_callback은 널리 사용되는 기능으로 정규식을 사용하여 일치하는 결과를 호출 할 수 있습니다. 그러나 PHP 7 이후보다 강력한 기능이 도입되었습니다. preg_replace_callback_array 는 유사한 작업을 수행 할뿐만 아니라 유연성과 가독성이 향상됩니다.
이 기사는 예제를 비교 하여이 두 기능이 어떻게 사용되는지와 각각의 장점을 심층적으로 설명하고, preg_replace_callback_array가 멀티 패턴 매칭을 다룰 때 더 우아한 선택인지 탐색합니다.
preg_replace_callback은 일반 패턴 배열과 콜백 함수를 수신하고 동일한 콜백을 사용하여 모든 일치를 처리합니다.
예:
$pattern = ['/foo/', '/bar/'];
$callback = function ($matches) {
return strtoupper($matches[0]);
};
$text = "foo and bar";
$result = preg_replace_callback($pattern, $callback, $text);
// 결과: "FOO and BAR"
문제는 다른 모드가 동일한 콜백 함수를 사용하여 로직을 처리하고 복잡한 일치의 경우 코드가 부풀어 오르고 불분명해진다는 것입니다.
preg_replace_callback_array를 사용하면 다른 일반 모드 에 대해 다른 콜백 함수를 지정할 수 있으므로 유연성과 가독성이 향상됩니다.
preg_replace_callback_array(array $patterns_and_callbacks, string $subject)
예:
$text = "Visit http://m66.net or send mail to info@m66.net";
$result = preg_replace_callback_array([
// 바꾸다URL
'~https?://[^\s]+~' => function ($matches) {
return '<a href="' . $matches[0] . '">' . $matches[0] . '</a>';
},
// 바꾸다Email
'/[\w\.-]+@[\w\.-]+\.\w+/' => function ($matches) {
return '<a href="mailto:' . $matches[0] . '">' . $matches[0] . '</a>';
},
], $text);
// 결과: 'Visit <a href="http://m66.net">http://m66.net</a> or send mail to <a href="mailto:info@m66.net">info@m66.net</a>'
각 패턴에 대해 명확한 콜백 함수를 지정하면 코드 로직이 명확해질 수 있으며 동일한 기능에서 IF/다른 경우 더 이상 일치하는 패턴이 있는지 결정할 필요가 없습니다.
하나는 HTML에 연결하기위한 하나와 다른 하나는 서로를 방해하지 않는 민감한 단어 대체와 같은 각 일치 패턴에 대해 완전히 다른 처리 로직을 제공 할 수 있습니다.
각 패턴은 해당 콜백에 바인딩되므로 여러 패턴이 함수를 공유 할 때 발생할 수있는 논리적 혼란 또는 잘못 처리를 피합니다.
preg_replace_callback_array는 배열 순서로 교체 작업을 수행하므로 우선 순위를 제어 할 수 있습니다. 다른 모드 전에 일부 교체 작업을 수행하도록합니다.
$text = "방문하십시오 http://m66.net,또는 연락처 admin@m66.net,또는 @john 자세히 알아보십시오。";
$result = preg_replace_callback_array([
// URL
'~https?://[^\s]+~' => function ($matches) {
return '<a href="' . $matches[0] . '">' . $matches[0] . '</a>';
},
// Email
'/[\w\.-]+@[\w\.-]+\.\w+/' => function ($matches) {
return '<a href="mailto:' . $matches[0] . '">' . $matches[0] . '</a>';
},
// @사용자
'/@(\w+)/' => function ($matches) {
return '<a href="http://m66.net/user/' . $matches[1] . '">@' . $matches[1] . '</a>';
},
], $text);
결과는 포럼, 댓글 영역, 채팅 시스템 등에 적합한 풍부한 텍스트 출력이됩니다.
preg_replace_callback_array 는 PHP 7.0에 도입되었으며 이전 버전 (예 : PHP 5.6)으로 실행하면 사용할 수 없습니다.
이전 버전의 PHP에 대한 지원을 유지하려면 전통적인 preg_replace_callback 만 사용할 수 있습니다.
preg_replace_callback_array는 특히 여러 모드에 다른 처리 로직이 필요한 경우보다 우아한 일반 교체 솔루션을 제공합니다. 프로젝트가 이미 PHP 7.0 이상으로 실행중인 경우 Preg_Replace_Callback을 기반으로 원래 멀티 모드 처리 로직을 마이그레이션하는 것이 좋습니다. 이는 코드 가독성을 향상시킬뿐만 아니라 유지 보수가 더 쉬워집니다.
미래의 PHP 개발은 더 이상 "그냥 사용"하는 것이 아니라 우아하고 명확하며 유지하기가 쉽습니다.