현재 위치: > 최신 기사 목록> 다중 패턴 순서 재정의 : preg_replace_callback_array를 사용할 때 콜백 함수의 실행 순서가 어떻게 결정됩니까?

다중 패턴 순서 재정의 : preg_replace_callback_array를 사용할 때 콜백 함수의 실행 순서가 어떻게 결정됩니까?

M66 2025-05-17

PHP에서 preg_replace_callback_array 함수는 여러 정규 표현 패턴에 대해 다른 콜백 함수를 지정할 수있는 강력한 도구입니다. 이 함수는 연관 배열을 통해 콜백 함수와 패턴을 연결하고 순서대로 대체합니다. 그러나 콜백 함수의 실행 순서는 어떻게 결정됩니까?

preg_replace_callback_array 의 기본 사용

preg_replace_callback_array 함수는 두 가지 매개 변수를 허용합니다. 첫 번째 매개 변수는 연관 배열이고, 배열의 키는 정규식 패턴이고 값은 콜백 함수입니다. 두 번째 매개 변수는 입력 문자열입니다. 함수는 배열에 정의 된 패턴의 순서대로 패턴 별 패턴과 입력 문자열을 교체합니다.

샘플 코드

 <?php
$patterns = [
    '/hello/' => function ($matches) {
        return "Hi";
    },
    '/world/' => function ($matches) {
        return "Earth";
    }
];

$string = "hello world! hello world!";
$result = preg_replace_callback_array($patterns, $string);
echo $result;  // 산출:Hi Earth! Hi Earth!
?>

이 예에서는 입력 문자열 "Hello World! Hello World!" 먼저 Hello 와 일치하고 Hi 로 교체됩니다. 그러면 세상 과 일치하고 지구 로 대체 될 것입니다. 콜백 함수의 실행 순서는 배열에서 패턴 정의의 순서에 따라 결정됩니다.

콜백 함수 실행 순서 결정 요인

preg_replace_callback_array 에서 콜백 함수의 실행 순서는 다음 요소에 의해 엄격하게 결정됩니다.

  1. 배열의 패턴 순서 : 콜백 함수 실행 순서는 전달 된 패턴 배열의 키 (즉, 정규 표현 패턴)의 순서에 의해 결정됩니다. PHP는 배열의 첫 번째 패턴으로 시작하여 콜백 함수를 순서대로 하나씩 실행합니다.

  2. 패턴 일치 우선 순위 : 여러 정규 표현식 패턴이 동일한 위치와 일치 할 수있는 경우 (예 : 두 패턴이 문자열에서 동일한 부분과 일치하는 경우) PHP는 콜백 함수를 실행하기 위해 패턴 배열의 순서에 따라 첫 번째 일치 패턴을 선택합니다. 따라서 패턴의 순서가 중요합니다.

  3. 글로벌 매칭의 영향 : 패턴이 문자열의 일부와 일치하고 교체되면 새 문자열의 내용이 후속 패턴의 일치에 영향을 줄 수 있습니다. 따라서 교체 된 문자열 컨텐츠는 후속 콜백 함수의 실행에 영향을 미칩니다.

예 : 여러 패턴이 같은 부분과 일치합니다

 <?php
$patterns = [
    '/o/' => function ($matches) {
        return "O";
    },
    '/world/' => function ($matches) {
        return "Universe";
    }
];

$string = "hello world!";
$result = preg_replace_callback_array($patterns, $string);
echo $result;  // 산출:hellO Universe!
?>

이 예에서는 / 세계 / 패턴이 월드 와 일치하지만 / o / 패턴이 처음 일치하고 O와 OO 로 대체되므로 최종 출력은 Hello Universe입니다! .

콜백 함수의 실행 순서가 복잡한 상황에 미치는 영향

콜백 함수가 실행되는 순서는 여러 패턴이 동일한 위치 또는 하위 문자열과 일치 할 때 특히 중요 해집니다. 특정 콜백 함수가 먼저 실행되는지 확인하려면 관련 정규식 패턴을 배열 앞에 놓아야합니다.

예를 들어, 다른 링크와 HTML 태그가 포함 된 문자열이 있다고 가정하고 먼저 링크를 교체 한 다음 HTML 태그를 교체하려고합니다. 이 시점에서 링크 교체 패턴은 HTML 태그 교체의 패턴보다 앞서 있어야합니다.

 <?php
$patterns = [
    '/https?:\/\/\S+/' => function ($matches) {
        return "<a href='{$matches[0]}'>Link</a>";
    },
    '/<b>.*?<\/b>/' => function ($matches) {
        return "<strong>{$matches[0]}</strong>";
    }
];

$string = "Visit https://m66.net for more <b>information</b>!";
$result = preg_replace_callback_array($patterns, $string);
echo $result;  // 산출:Visit <a href='https://m66.net'>Link</a> for more <strong><b>information</b></strong>!
?>

이 예에서 /https? : \/\/\ s+/ Mode는 먼저 링크를 대체하고 / <B> . 최종 결과는 링크와 태그가 올바르게 바뀌는 것입니다.

요약

preg_replace_callback_array 함수를 사용하면 연관 배열을 통해 여러 정규식 패턴과 콜백 함수를 정의 할 수 있습니다. 콜백 함수의 실행 순서는 패턴 배열의 패턴 순서에 의해 결정됩니다. 다중 패턴이 동일한 부분과 일치하면 선호하는 일치 패턴이 먼저 해당 콜백 함수를 실행합니다. 따라서 preg_replace_callback_array를 사용할 때 패턴 배열의 순서가 귀하의 요구를 충족하는지 확인하십시오.