현재 위치: > 최신 기사 목록> MB_EREGI_REPLACE 기능을 사용할 때 명명 된 그룹화를 구현하는 방법 (MB_EREGI_REPLAPE는 기본적으로 명명 된 그룹화를 지원하지 않지만 해결 방법을 통해 구현할 수 있습니다).

MB_EREGI_REPLACE 기능을 사용할 때 명명 된 그룹화를 구현하는 방법 (MB_EREGI_REPLAPE는 기본적으로 명명 된 그룹화를 지원하지 않지만 해결 방법을 통해 구현할 수 있습니다).

M66 2025-07-18

PHP에서 MB_EREGI_REPLACE 는 멀티 바이트 문자열의 정기적 인 교체 기능이며 사례 감수성 일치를 지원합니다. POSIX 정규식 표현 구문을 기반으로하므로 PCRE ( PREG_* 시리즈 함수)와 같은 그룹화 이름을 지원하지 않습니다. 명명 된 그룹화는 정규 표현식의 특정 부분에 대한 의미있는 이름을 허용하여 코드의 유지 관리 및 읽기를 용이하게합니다.

이 기사는 MB_EREGI_REPLAPE가 이름이 지정된 그룹화를 지원하지 않지만 일부 해결 방법은 명명 된 그룹화의 효과를 시뮬레이션하는 데 사용될 수 있지만 명명 된 그룹화의 효과를 시뮬레이션하는 방법을 소개합니다.


1. MB_EREGI_REPLACE에 대한 제한 및 이름이 명명되었습니다

MB_EREGI_REPLACE 에서 사용하는 일반 구문은 (? <name> 패턴) 과 같은 PCRE 스타일이라는 그룹 이름을 지원하지 않으며 숫자 이외의 그룹화 식별자를 지원하지 않습니다.

예:

 $pattern = '([a-z]+)'; // 정상적인 그룹화

그러나 그것은 다음과 같이 작성할 수 없습니다.

 $pattern = '(?<word>[a-z]+)'; // 명명 된 그룹화는 지원되지 않습니다

따라서 특정 그룹의 내용을 참조 해야하는 경우 \ 1 , \ 2 등과 같은 수치 인덱스를 통해서만 색인 할 수 있습니다.


2. "명명 된 그룹화"의 효과를 달성하기 위해 교체 콜백과 결합 된 디지털 그룹화를 사용하십시오.

MB_EREGI_REPLACE에서 이름이 지정된 그룹화를 직접 사용할 수는 없지만 그룹화 및 교체 중 콜백 함수와 함께 시뮬레이션 할 수 있습니다.

그러나 mb_eregi_replace 자체에는 콜백 버전이 없습니다. 먼저 MB_EREG_SEARCH 시리즈 기능을 사용하여 일치하고 그룹화 컨텐츠를 캡처 한 다음 PHP에서 교체 로직을 구현할 수 있습니다.

샘플 흐름 :

  1. 문자열과 하나씩 일치하려면 mb_ereg_search_initmb_ereg_search를 사용하십시오.

  2. 각 경기 후 그룹화 컨텐츠가 얻어 수동으로 교체됩니다.

  3. PHP 배열을 사용하여 명명 된 그룹의 구조를 시뮬레이션하십시오.


3. 샘플 코드

다음 코드는 MB_EREG_SEARCH 시리즈 기능을 사용하여 그룹화 컨텐츠를 캡처하고 이름이 명명 된 그룹화 및 완전한 교체 방법을 보여줍니다.

 <?php

// 보류중인 문자열
$text = "User: alice, Email: alice@example.com";

// POSIX 스타일 규칙 성,두 그룹,사용자 이름 및 이메일
$pattern = 'User: ([a-z]+), Email: ([a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,})';

// 검색 초기화
mb_ereg_search_init($text, $pattern, 'i'); // i사례 둔감을 나타냅니다

$result = '';
$offset = 0;

while ($match = mb_ereg_search_pos()) {
    // 일치의 시작 위치와 길이를 취하십시오
    list($start, $length) = $match;

    // 완전한 일치 문자열을 얻으십시오
    $fullMatch = mb_substr($text, $start, $length);

    // 캡처 된 그룹화 콘텐츠를 얻으십시오
    $regs = mb_ereg_search_getregs();

    // 명명 된 그룹화를 시뮬레이션하십시오
    $namedGroups = [
        'username' => $regs[1],
        'email' => $regs[2],
    ];

    // 교체 로직을 처리하십시오,예를 들어, 사용자 이름을 대문자로 삼으십시오,이메일의 숨겨진 부분
    $replacement = "User: " . strtoupper($namedGroups['username']) . ", Email: " . maskEmail($namedGroups['email']);

    // 스 플라이 싱 결과
    $result .= mb_substr($text, $offset, $start - $offset) . $replacement;

    $offset = $start + $length;

    // 계속 검색하십시오
    mb_ereg_search_setpos($offset);
}

// 나머지 부품을 접합합니다
$result .= mb_substr($text, $offset);

echo $result;

// 도우미 기능,이메일 섹션을 숨기십시오
function maskEmail($email) {
    $parts = explode('@', $email);
    $name = $parts[0];
    $domain = $parts[1];
    $maskedName = substr($name, 0, 1) . str_repeat('*', max(0, strlen($name) - 2)) . substr($name, -1);
    return $maskedName . '@' . $domain;
}
?>

4. 설명

  • mb_eregi_replace는 콜백을 직접 사용할 수 없으므로 MB_EREG_SEARCH_INIT 및 관련 기능을 사용하여 루프 매칭을 달성하고 수동으로 교체를 처리합니다.

  • $ regs 배열을 사용하여 그룹화 컨텐츠를 캡처하고 배열 키 이름을 통해 "명명 된 그룹화"를 시뮬레이션하여 코드를 명확하게하십시오.

  • 교체 프로세스는 전적으로 PHP 코드로 처리되며 임의의 복잡한 논리를 구현할 수 있습니다.

  • 이 예에서는 사용자 이름 대문자 및 사서함에 일부 문자 숨기기가 구현됩니다.


5. 요약

MB_EREG_REPLACE 기능 자체는 그룹화 이름이 지정된 그룹화를 지원하지 않지만 MB_EREG_SEARCH 시리즈 기능을 통해 PHP 코드 처리와 결합하여 유사한 이름의 그룹화 효과를 달성하여 코드 가독성 및 유지 보수를 향상시킬 수 있습니다.

보다 복잡한 일반 기능이 필요하고 명명 된 그룹화 지원이 필요한 경우 preg_replace_callback을 사용하는 것이 좋습니다. 그러나 MB_EREG 제품군만큼 강력한 멀티 바이트 인코딩을 지원하지는 않습니다.