PHP에서 MB_EREGI_REPLACE 는 멀티 바이트 문자열의 정기적 인 교체 기능이며 사례 감수성 일치를 지원합니다. POSIX 정규식 표현 구문을 기반으로하므로 PCRE ( PREG_* 시리즈 함수)와 같은 그룹화 이름을 지원하지 않습니다. 명명 된 그룹화는 정규 표현식의 특정 부분에 대한 의미있는 이름을 허용하여 코드의 유지 관리 및 읽기를 용이하게합니다.
이 기사는 MB_EREGI_REPLAPE가 이름이 지정된 그룹화를 지원하지 않지만 일부 해결 방법은 명명 된 그룹화의 효과를 시뮬레이션하는 데 사용될 수 있지만 명명 된 그룹화의 효과를 시뮬레이션하는 방법을 소개합니다.
MB_EREGI_REPLACE 에서 사용하는 일반 구문은 (? <name> 패턴) 과 같은 PCRE 스타일이라는 그룹 이름을 지원하지 않으며 숫자 이외의 그룹화 식별자를 지원하지 않습니다.
예:
$pattern = '([a-z]+)'; // 정상적인 그룹화
그러나 그것은 다음과 같이 작성할 수 없습니다.
$pattern = '(?<word>[a-z]+)'; // 명명 된 그룹화는 지원되지 않습니다
따라서 특정 그룹의 내용을 참조 해야하는 경우 \ 1 , \ 2 등과 같은 수치 인덱스를 통해서만 색인 할 수 있습니다.
MB_EREGI_REPLACE에서 이름이 지정된 그룹화를 직접 사용할 수는 없지만 그룹화 및 교체 중 콜백 함수와 함께 시뮬레이션 할 수 있습니다.
그러나 mb_eregi_replace 자체에는 콜백 버전이 없습니다. 먼저 MB_EREG_SEARCH 시리즈 기능을 사용하여 일치하고 그룹화 컨텐츠를 캡처 한 다음 PHP에서 교체 로직을 구현할 수 있습니다.
샘플 흐름 :
문자열과 하나씩 일치하려면 mb_ereg_search_init 및 mb_ereg_search를 사용하십시오.
각 경기 후 그룹화 컨텐츠가 얻어 수동으로 교체됩니다.
PHP 배열을 사용하여 명명 된 그룹의 구조를 시뮬레이션하십시오.
다음 코드는 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;
}
?>
mb_eregi_replace는 콜백을 직접 사용할 수 없으므로 MB_EREG_SEARCH_INIT 및 관련 기능을 사용하여 루프 매칭을 달성하고 수동으로 교체를 처리합니다.
$ regs 배열을 사용하여 그룹화 컨텐츠를 캡처하고 배열 키 이름을 통해 "명명 된 그룹화"를 시뮬레이션하여 코드를 명확하게하십시오.
교체 프로세스는 전적으로 PHP 코드로 처리되며 임의의 복잡한 논리를 구현할 수 있습니다.
이 예에서는 사용자 이름 대문자 및 사서함에 일부 문자 숨기기가 구현됩니다.
MB_EREG_REPLACE 기능 자체는 그룹화 이름이 지정된 그룹화를 지원하지 않지만 MB_EREG_SEARCH 시리즈 기능을 통해 PHP 코드 처리와 결합하여 유사한 이름의 그룹화 효과를 달성하여 코드 가독성 및 유지 보수를 향상시킬 수 있습니다.
보다 복잡한 일반 기능이 필요하고 명명 된 그룹화 지원이 필요한 경우 preg_replace_callback을 사용하는 것이 좋습니다. 그러나 MB_EREG 제품군만큼 강력한 멀티 바이트 인코딩을 지원하지는 않습니다.