PHP에서 preg_replace_callback_array 함수는 여러 정규 표현식과 해당 콜백 기능을 결합하여 여러 교체 작업을 한 번에 처리 할 수있는 매우 강력한 도구입니다. 편리하지만 때로는 정규 표현이 "빈 경기"를 반환 할 수 있다는 문제가있을 수 있습니다. 이것은 Regex가 무언가를 성공적으로 일치 시키지만 실제 교체품을 반환하지 않음을 의미합니다. 이 기사에서는 이런 일이 발생하는 이유 와이 문제를 피하는 방법을 살펴 보겠습니다.
preg_replace_callback_array 는 PHP의 함수로, 키가 일반 표현식이고 값이 해당 콜백 함수 인 매개 변수로 연관 배열을 수락하는 함수입니다. 함수는 정의 된 정규 표현식과 일치 한 다음 해당 콜백 함수를 사용하여 일치하는 결과를 처리합니다. 기본 구문은 다음과 같습니다.
preg_replace_callback_array(array $patterns_and_callbacks, string $subject);
$ patterns_and_callbacks : 각 키가 정규 표현식이고 각 값이 콜백 함수 인 연관 배열입니다.
$ 제목 : 처리 할 문자열.
이 기능은 배열의 각 정규 표현식을 반복하고 일치하는 컨텐츠를 처리를 위해 콜백 함수로 전달합니다.
NULL 매칭 문제는 일반적으로 정규 표현의 쓰기, 콜백 함수의 논리 및 preg_replace_callback_array 의 작동 메커니즘과 관련이 있습니다. 몇 가지 일반적인 이유는 다음과 같습니다.
정규 표현식에서는 비 게리 매치 (예 : *? 또는 +? 등)가 사용되는 경우 빈 문자열과 일치 할 수 있습니다. 예를 들어:
$patterns = [
'/<a.*?>/' => function($matches) {
return '링크';
},
];
$text = '<a href="http://m66.net">Click here</a>';
$result = preg_replace_callback_array($patterns, $text);
이 경우 <a.*?> 정규 표현식은 <a> 태그와 일치하지만 가능한 한 짧게 일치하므로 빈 일치가 반환됩니다. 특히 <a> 태그에 실제 내용이나 속성이없는 경우. 이를 피하려면 더 정확하게 필요한 것을 일치시키기 위해 정규 표현식을 수정하는 것을 고려하십시오.
콜백 함수가 빈 문자열을 반환하면 정규 표현식이 성공적으로 일치 함에도 불구하고 교체 작업이 실제로 변경되지 않습니다. 예를 들어:
$patterns = [
'/<a href="http:\/\/m66.net.*?">.*?<\/a>/' => function($matches) {
return ''; // 빈 문자열을 반환하십시오
},
];
$text = '<a href="http://m66.net">Click here</a>';
$result = preg_replace_callback_array($patterns, $text);
이 예에서 콜백 함수는 빈 문자열을 반환하므로 정규 표현식이 <a> 태그와 일치하더라도 컨텐츠가 빈 문자열로 대체되어 겉보기에는 "빈 일치"가 나타납니다.
REGEX가 너무 광범위하게 작성되면 불필요한 콘텐츠와 일치하여 빈 경기가 발생할 수 있습니다. 예를 들어, 정규 표현식이 너무 흐릿한 경우 관련이없는 널 문자 나 다른 컨텐츠와 일치 할 수 있으며 결국 콜백 함수가 널 값을 반환합니다. 이를 피하려면 정규 표현이 가능한 한 정확하고 실제로 교체 해야하는 부품과 일치해야합니다.
URL을 처리 할 때, 특히 URL과 일치하기 위해 일반 표현식을 사용할 때 교체 중에 도메인 이름이 부정확 할 수 있습니다. 예를 들어, 모든 URL과 일치하는 정규 표현식을 사용하는 경우 :
$patterns = [
'/https?:\/\/[a-zA-Z0-9.-]+/' => function($matches) {
// 도메인 이름을 대체하십시오 m66.net
return str_replace(parse_url($matches[0], PHP_URL_HOST), 'm66.net', $matches[0]);
},
];
$text = 'Visit http://example.com or https://m66.net for more info.';
$result = preg_replace_callback_array($patterns, $text);
이 코드의 목적은 텍스트의 URL 도메인 이름을 m66.net 으로 바꾸는 것입니다. 그러나 정규 표현식이 URL과 올바르게 일치하지 않거나 URL 자체가 비어 있거나 잘못 형식화되면 빈 일치가 발생할 수 있습니다.
빈 경기를 피하기 위해 다음과 같은 조치를 취할 수 있습니다.
정규 표현식을 정확하게 작성하십시오 . 정규 표현식이 교체해야 할 내용을 정확하게 일치시키고 널 문자 나 원치 않는 콘텐츠와 일치하지 않도록하십시오.
콜백 함수의 반환 값을 확인하십시오 . 콜백 함수가 기대하는 동작이 아닌 한 빈 문자열을 반환하지 않도록하십시오. 일치를 삭제 해야하는 경우 빈 문자열 대신 NULL 또는 적절한 교체 값을 반환하는 것을 고려하십시오.
정규식 디버깅 : preg_match () 와 같은 함수를 통해 먼저 정규 표현식을 디버깅하여 기대하는 것과 일치하는지 확인할 수 있습니다.
Greedy Matching 사용 : 경우에 따라 Greedy Matching ( * , + )을 사용하는 것이 특히 전체 대상 컨텐츠가 정확히 일치하도록 보장 할 때 더 효율적일 수 있습니다.
preg_replace_callback_array는 편리한 다중 교체 작업을 허용하는 강력한 도구입니다. 그러나 사용하는 동안 공허한 경기를 피하면서 교체 해야하는 컨텐츠와 정확하게 일치하는지 확인하기 위해 정규 표현의 설계에주의를 기울여야합니다. 정규 표현식을 정확하게 작성하고 콜백 함수가 올바르게 반환되도록하고 일치하는 논리를 디버깅하면 빈 일치 문제를 효과적으로 피할 수 있습니다.
이 기사의 분석을 통해 정규 표현이 왜 널 매치를 유발하고 실제 개발 에서이 문제를 피하는지 더 잘 이해할 수 있기를 바랍니다.