현재 위치: > 최신 기사 목록> 정기적 인 고장을 방지하기 위해 mb_eregi_replace 기능을 사용하기 전에 문자열에서 불법 문자를 전제하는 방법은 무엇입니까?

정기적 인 고장을 방지하기 위해 mb_eregi_replace 기능을 사용하기 전에 문자열에서 불법 문자를 전제하는 방법은 무엇입니까?

M66 2025-06-15

PHP에서 MB_EREGI_REPLATE 기능은 멀티 바이트 문자를 정기적으로 교체하고 케이스를 무시하는 데 사용됩니다. UTF-8과 같은 멀티 바이트 인코딩 스트링을 처리하는 데 매우 유용합니다. 그러나 실제로 사용하면 입력 문자열에 불법 문자가 포함 된 경우 (예 : 일반 표현식의 특수 문자와 같은) 정기적 인 일치 실패 또는 오류보고로 이어집니다.

이 기사는 불법적 인 문자로 인한 정규 표현 실패 문제를 피하기 위해 MB_EREGI_REPLACE 기능을 사용하기 전에 사전 프로세스 문자열을 소개합니다.


1. 문제 배경

MB_EREGI_REPLACE 의 첫 번째 매개 변수는 정규 표현식 패턴이고, 두 번째 매개 변수는 교체 내용이며, 세 번째 매개 변수는 처리 할 문자열입니다.

예:

 <?php
$text = "Hello World!";
$pattern = "world";
$replacement = "PHP";

echo mb_eregi_replace($pattern, $replacement, $text);
?>

출력은 다음과 같습니다.

 Hello PHP!

그러나 $ 패턴 또는 보류 문자열에 eScaped 특수 문자가 포함되면 경기가 실패하고 경고가 발생됩니다.


2. 규칙적인 실패를 일으킬 수있는 불법적 인 캐릭터

정규 표현식에서 특별한 의미를 가진 캐릭터는 다음과 같습니다.

 . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

이 문자가 패턴이나 문자열에 나타나면 교체 할 경우 올바르게 탈출해야합니다.


3. 전처리 단계

3.1 정기적 인 특수 캐릭터를 탈출하십시오

PHP의 자체 기능 preg_quote () 는 정기적 인 표현식으로 특수 문자를 피할 수 있습니다. 그러나 mb_eregi_replace는 preg_* 시리즈 PCRE가 아닌 MBregex Extension의 규칙 성을 사용하며 탈출 규칙은 약간 다르지만 일반적으로 preg_quote Escapes 대부분의 특수 문자는 여전히 유효합니다.

예:

 <?php
$pattern_raw = "hello.world"; // . 특별한 캐릭터입니다
$pattern = preg_quote($pattern_raw, '/'); // 탈출 hello\.world

$text = "Hello World! hello.world test.";

echo mb_eregi_replace($pattern, "PHP", $text);
?>

산출:

 Hello World! PHP test.

3.2 불법 문자 필터 또는 교체

계류중인 문자열에 일치가 실패하게하는 제어 문자 (예 : 인쇄되지 않은 문자)가 포함되어 있다고 걱정하는 경우 먼저 규칙적으로 필터링 할 수 있습니다.

 <?php
// 인쇄되지 않은 문자를 제거하십시오,일반적인 캐릭터와 중국어 만 보존됩니다
$clean_text = preg_replace('/[^\P{C}\n]+/u', '', $text);

4. 포괄적 인 예

다음 예는 MB_EREGI_REPLACE 에 호출하기 전에 패턴에서 특수 문자를 피하는 방법을 보여줍니다.

 <?php
// 교체 해야하는 줄과 패턴
$pattern_raw = "foo.bar?"; // 특수 문자가 포함되어 있습니다 . 그리고 ?
$replacement = "PHP";
$text = "Hello foo.bar? world! \x01\x02"; // 제어 문자를 포함합니다

// 1. 탈출 모드의 특수 문자
$pattern = preg_quote($pattern_raw, '/');

// 2. 전처리 된 텍스트,제어 문자를 제거하십시오
$clean_text = preg_replace('/[^\P{C}\n]+/u', '', $text);

// 3. 사용mb_eregi_replace교체하십시오(사건을 무시하십시오)
$result = mb_eregi_replace($pattern, $replacement, $clean_text);

echo $result;
?>

산출: