PHP에서 preg_replace_callback_array 함수는 일반적으로 정기적 인 교체를 수행 할 때 콜백 작업을 수행하는 데 사용됩니다. 이 기능은 키가 일반 표현식 인 어레이를 허용하며 값은 일치하는 콜백 함수입니다. 그러나 경우에 따라 특정 그룹을 캡처하여 $ 경기 에서 나타나는 것을 방지하여 불필요한 오버 헤드 또는 복잡한 처리를 초래할 수 있습니다.
불필요한 $를 받지 않으면 preg_replace_callback_array 의 콜백 함수에서 컨텐츠와 일치하지 않으려면 캡처 그룹화를 사용할 수 있습니다. 캡처되지 않은 그룹화는 일치 할 때 일부 그룹이 캡처되지 않도록하여 콜백 기능에서 불필요한 일치 결과를 줄입니다.
캡처되지 않은 그룹화는 정기적 인 표현으로 괄호를 접두사로 선언하여 ? : . 예를 들어, (? : ...)는 비 캡처 그룹입니다. 이 경우 정규 표현식의 그룹은 $ matches 배열로 캡처되지 않지만 일치 패턴을 그룹화하는 데 사용되는 구성 요소입니다.
내부에 여러 그룹의 정규 표현이 있다고 가정하지만, 다른 그룹의 내용은 다른 그룹의 내용에 대해서만 관심이 있습니다. 그런 다음 정규 표현을 최적화하기 위해 캡처되지 않은 그룹화를 사용할 수 있습니다.
<?php
// 예:텍스트를 바꾸십시오URL
$pattern = '/(?:https?:\/\/)(m66.net\/[a-z0-9\/\?=&]*)/i';
$replacement = function ($matches) {
// 그냥 돌봐URL의 길 부분,전체가 필요하지 않습니다URL그리고 계약 섹션
return 'https://m66.net' . $matches[1];
};
$input = '방문하십시오 https://m66.net/abc/def?query=xyz 또는 http://m66.net/12345';
$output = preg_replace_callback_array([
$pattern => $replacement,
], $input);
echo $output;
?>
정규 표현 :
(? : https? : \/\/) :이 부분은 URL의 프로토콜 부분 (http 또는 https)과 일치하는 비과전 그룹화입니다. 이 부분이 필요하지 않으므로 캡처 그룹화를 사용합니다.
(m66.net \/[a-z0-9 \/\? = &]*) : 이것은 캡처 그룹이며, 우리가 관심을 갖는 것은 m66.net (예 : /abc/def? query = xyz )의 경로 부분입니다.
콜백 함수 :
콜백 함수에서는 프로토콜 부분 ( https : // http : // )을 무시하고 $ matches [1] 를 통해 URL의 경로 부분을 얻습니다.
프로토콜 부분이 캡처되지 않기 때문에 preg_replace_callback_array는 콜백 함수의 대체 값으로서 $ [1] 만 제공합니다.
출력 결과 :
원본 텍스트의 URL은 우리가 관심있는 형식으로 올바르게 대체되며 불필요한 $ 컨텐츠는 없습니다.
캡처 그룹화 (? : ...) 를 사용하면 콜백 함수에서 불필요한 일치 그룹을받지 않도록 도와줍니다. 이는 불필요한 자원 소비를 줄일뿐만 아니라 특히 복잡한 정규 표현식을 다룰 때 코드를보다 간결하고 이해하기 쉽게 만듭니다.주의가 필요한 일치하는 결과를 효과적으로 줄일 수 있습니다.