현재 위치: > 최신 기사 목록> PHP의 MB_EREGI_REPLACE 기능에서 1 달러를 대체하는 방법이지만 스키마에서는 그룹화가 없습니까?

PHP의 MB_EREGI_REPLACE 기능에서 1 달러를 대체하는 방법이지만 스키마에서는 그룹화가 없습니까?

M66 2025-06-16

PHP에서 MB_EREGI_REPLACE 기능은 사례 불신 정기 표현식 교체를 지원하는 멀티 바이트 안전 정규 교체 기능입니다. 사용량은 Eregi_replace 와 유사하지만 멀티 바이트 문자열에 최적화됩니다.


문제 배경

교체에 mb_eregi_replace를 사용하는 경우 교체 문자열에서 $ 1을 사용하여 첫 번째 캡처 그룹의 내용을 참조하는 것이 일반적입니다.

 $pattern = 'pattern';
$replacement = '$1 something';
mb_eregi_replace($pattern, $replacement, $subject);

그러나 정규식 패턴으로 그룹화가 정의되지 않으면 (즉, 괄호로 둘러싸인 하위 패턴이 없음) $ 1 에는 해당 콘텐츠가 없으며 $ 1은 일반 문자열로 간주되며 일치하는 컨텐츠로 대체되지 않습니다.

이로 인해 대체 결과가 예상되지 않는 결과가 발생할 수 있습니다.


이 문제가 발생하는 이유는 무엇입니까?

$ 1$ 2 와 같은 특수 기호는 캡처 그룹의 내용을 정규 표현식으로 참조하는 데 사용됩니다. 정규 표현이 괄호로 그룹화되지 않으면 이러한 참조는 유효하지 않습니다.

예를 들어:

 $pattern = 'hello';
$replacement = '$1 world';
$subject = 'hello';

// 그룹화 없음,$1 해당 콘텐츠가 없습니다
echo mb_eregi_replace($pattern, $replacement, $subject);

이 코드의 결과는 다음과 같습니다.

 $1 world

상상 대신 :

 hello world

해결책

교체 결과에서 $ 1을 사용하려면 정규 표현식에 해당 캡처 그룹이 있는지 확인해야합니다.

해결책 1 : 그룹 정규 표현

예를 들어, 모드를 다음으로 변경합니다.

 $pattern = '(hello)';
$replacement = '$1 world';
$subject = 'hello';

echo mb_eregi_replace($pattern, $replacement, $subject);

출력 결과는 다음과 같습니다.

 hello world

알아채다:

  • 괄호를 사용하여 참조 할 부분을 감싸서 캡처 그룹화를 나타냅니다.

  • 일치하는 문자열 전체 만 캡처하더라도 $ 1을 사용할 수 있습니다.


반응식 2 : $ 0 의 전체 일치하는 문자열을 참조하십시오.

일부 정기적 인 교체 함수에서 $ 0는 전체 일치 문자열을 나타냅니다. 불행히도, MB_EREGI_REPLACE는 $ 0를 지원하지 않으며 그룹화에서 $ 1 , $ 2 등만 참조 할 수 있습니다.


해결책 3 : $ 1을 사용하지 말고 콜백으로 교체하십시오.

그룹화를 추가하기 위해 패턴을 수정하는 것이 편리하지 않은 경우 MB_EREG_REPLAY_CALLBACK 과 같은 콜백 함수를 대신 지원하는 대체 기능을 사용한 다음 콜백에서 일치하는 로직을 처리 할 수 ​​있습니다.

예:

 $pattern = 'hello';
$subject = 'hello';

$result = mb_ereg_replace_callback($pattern, function ($matches) {
    // $matches[0] 전체 경기입니다
    return $matches[0] . ' world';
}, $subject);

echo $result;

산출:

 hello world

요약

  • MB_EREGI_REPLACE는 $ 1$ 2를 사용하여 그룹화 컨텐츠를 참조하며 해당 캡처 그룹이 정규 표현식에 존재하도록해야합니다.

  • 그룹화가 없으면 $ 1은 일치하는 콘텐츠로 대체되지 않지만 일반 문자열로 취급됩니다.

  • 그룹을 추가하고 싶지 않거나 추가 할 수없는 경우 콜백 기능을 사용하여 복잡한 교체를 구현하는 것이 좋습니다.


참조 링크