PHP 정규 일치 중국어 왜곡 문자에 대한 솔루션: 먼저 PHP 코드 파일을 연 다음 UTF8 수정자를 코드 파일에 추가합니다. 정규식 문은 "preg_replace('/[万]/u',' Wan)입니다. ',$a);".
권장: "PHP 비디오 튜토리얼"
특정 문제:
정규식을 사용하여 PHP 문자열의 중국어 문자를 일치시키면 문자가 깨집니다
<?php echo '<h2>正则表达式匹配中文</h2><br>'; $a = '天地不仁,以万物为刍狗'; $b = preg_replace('/万/','萬',$a); echo $b; echo '<h2>加上方括号后替换结果出现乱码</h2><br>'; $c = '天地不仁,以万物为刍狗'; $d = preg_replace('/[万]/','萬',$a); echo $d; ?>
위 프로그램의 결과는 다음과 같습니다. http://nyaii.com/s/test.php에서 찾을 수 있습니다. 어떤 이유에서인지 일치하는 한자에 대괄호를 추가하면 문자가 깨져서 나타납니다. 같은 상황에서 자바스크립트로 실행하면 모든 것이 잘 작동합니다.
'天地不仁'.replace(/[天]/,'') //outputs "地不仁"
해결책:
UTF8 수정자 추가
$d = preg_replace('/[万]/u','萬',$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])) . ' '; //e4 b8 87 }
우리는 "만"이라는 단어의 utf8 16진수 인코딩인 e4b887을 얻을 수 있습니다
그러면 utf8이 켜지지 않습니다. 수정자로 사용되는 경우 정규식 엔진은 "만"을 독립 문자로 처리하지 않고 3바이트의 연속 데이터로 처리합니다.
결론은 다음과 같습니다.
일치하는 []가 없을 경우 16진수 인코딩 값이 e4 b8 87인 세 개의 연속 문자를 찾는 것입니다. 즉, 귀하의 패턴은 실제로는 xe4xb8x87이지만 이런 종류의 경우 연속된 문자 수가 문자열에 나타나면 "만"이라는 단어만 일치할 수 있으므로 교체 후에 문자가 왜곡되지 않습니다. 그러나 문자열에 이모티콘과 같은 4바이트 utf8 인코딩 문자가 포함될 수 있는 경우 문제가 발생할 수 있습니다
Wan 외부에서 []를 래핑하면 정규식 엔진이 실제로 [ xe4xb8x87]을 찾습니다. 정규식을 이해하는 사람은 빠르게 실제로 이 세 문자 중 하나와 일치하므로 현재 만자를 제외한 다른 한자에 영향을 미칩니다
utf8 수식어를 추가하면 "Wan"은 정규식에 의해 독립 문자로 처리됩니다. , 그러면 이 문제는 더 이상 발생하지 않습니다
자바스크립트의 경우 문자 인코딩이 네이티브 유니코드이므로 각 문자가 바이트 데이터로 분할되지 않고 하나의 문자로 처리되므로 이러한 문제는 발생하지 않습니다
위 내용은 PHP 정규 매칭 중국어 왜곡 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!