>백엔드 개발 >PHP 문제 >PHP 정규 매칭 중국어 왜곡 문제

PHP 정규 매칭 중국어 왜곡 문제

藏色散人
藏色散人원래의
2020-09-30 09:38:143303검색

PHP 정규 일치 중국어 왜곡 문자에 대한 솔루션: 먼저 PHP 코드 파일을 연 다음 UTF8 수정자를 코드 파일에 추가합니다. 정규식 문은 "preg_replace('/[万]/u',' Wan)입니다. ',$a);".

PHP 정규 매칭 중국어 왜곡 문제

권장: "PHP 비디오 튜토리얼"

특정 문제:

정규식을 사용하여 PHP 문자열의 중국어 문자를 일치시키면 문자가 깨집니다

<?php
echo &#39;<h2>正则表达式匹配中文</h2><br>&#39;;
$a = &#39;天地不仁,以万物为刍狗&#39;;
$b = preg_replace(&#39;/万/&#39;,&#39;萬&#39;,$a);
echo $b;
echo &#39;<h2>加上方括号后替换结果出现乱码</h2><br>&#39;;
$c = &#39;天地不仁,以万物为刍狗&#39;;
$d = preg_replace(&#39;/[万]/&#39;,&#39;萬&#39;,$a);
echo $d;
 ?>

위 프로그램의 결과는 다음과 같습니다. http://nyaii.com/s/test.php에서 찾을 수 있습니다. 어떤 이유에서인지 일치하는 한자에 대괄호를 추가하면 문자가 깨져서 나타납니다. 같은 상황에서 자바스크립트로 실행하면 모든 것이 잘 작동합니다.

 &#39;天地不仁&#39;.replace(/[天]/,&#39;&#39;)
 //outputs "地不仁"

해결책:

UTF8 수정자 추가

$d = preg_replace(&#39;/[万]/u&#39;,&#39;萬&#39;,$a);

다른 수정자는

http://php.net/manual/en/reference.pcre.pattern.modifiers를 참조하세요. 다음은 주제 댓글의 질문에 대한 보충 내용입니다

[] 안에 u 수식자를 추가해야 하는 이유는 사실 엄밀히 말하면 두 상황 모두 u 수식자를 추가하는 것이 좋습니다

하지만 []로 인해 문자가 왜곡되는 이유는 무엇입니까? 이는 문자 수준이 아닌 바이트 수준에서 설명되어야 합니다.

우선, 우리는 PHP 문자열이 유니코드로 저장되지 않는다는 것을 알고 있으며, 이 코드를 살펴보겠습니다

<?php
$a = "万";
echo strlen($a); //3
for ($i = 0; $i < strlen($a); $i++) {
    echo dechex(ord($a[$i])) . &#39; &#39;; //e4 b8 87
}

우리는 "만"이라는 단어의 utf8 16진수 인코딩인 e4b887을 얻을 수 있습니다

그러면 utf8이 켜지지 않습니다. 수정자로 사용되는 경우 정규식 엔진은 "만"을 독립 문자로 처리하지 않고 3바이트의 연속 데이터로 처리합니다.

결론은 다음과 같습니다.

일치하는 []가 없을 경우 16진수 인코딩 값이 e4 b8 87인 세 개의 연속 문자를 찾는 것입니다. 즉, 귀하의 패턴은 실제로는 xe4xb8x87이지만 이런 종류의 경우 연속된 문자 수가 문자열에 나타나면 "만"이라는 단어만 일치할 수 있으므로 교체 후에 문자가 왜곡되지 않습니다. 그러나 문자열에 이모티콘과 같은 4바이트 utf8 인코딩 문자가 포함될 수 있는 경우 문제가 발생할 수 있습니다

Wan 외부에서 []를 래핑하면 정규식 엔진이 실제로 [ xe4xb8x87]을 찾습니다. 정규식을 이해하는 사람은 빠르게 실제로 이 세 문자 중 하나와 일치하므로 현재 만자를 제외한 다른 한자에 영향을 미칩니다

utf8 수식어를 추가하면 "Wan"은 정규식에 의해 독립 문자로 처리됩니다. , 그러면 이 문제는 더 이상 발생하지 않습니다

자바스크립트의 경우 문자 인코딩이 네이티브 유니코드이므로 각 문자가 바이트 데이터로 분할되지 않고 하나의 문자로 처리되므로 이러한 문제는 발생하지 않습니다

위 내용은 PHP 정규 매칭 중국어 왜곡 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.