문제

UTF-8 PHP 파일에 다음 PHP 코드가 있습니다.

var_dump(setlocale(LC_CTYPE, 'de_DE.utf8', 'German_Germany.utf-8', 'de_DE', 'german'));
var_dump(mb_internal_encoding());
var_dump(mb_internal_encoding('utf-8'));
var_dump(mb_internal_encoding());
var_dump(mb_regex_encoding());
var_dump(mb_regex_encoding('utf-8'));
var_dump(mb_regex_encoding());
var_dump(preg_replace('/\bweiß\b/iu', 'weiss', 'weißbier'));

나는 마지막 동정인이 단어의 일부가 아닌 전체 단어 만 대체하기를 원합니다.

내 Windows 컴퓨터에서 반환됩니다.

string 'German_Germany.1252' (length=19)
string 'ISO-8859-1' (length=10)
boolean true
string 'UTF-8' (length=5)
string 'EUC-JP' (length=6)
boolean true
string 'UTF-8' (length=5)
string 'weißbier' (length=9)

웹 서버 (Linux)에서 다음과 같이받습니다.

string(10) "de_DE.utf8"
string(10) "ISO-8859-1"
bool(true)
string(5) "UTF-8"
string(10) "ISO-8859-1"
bool(true)
string(5) "UTF-8"
string(9) "weissbier"

따라서 Regex는 Windows에서는 예상대로 작동하지만 Linux에서는 작동하지 않습니다.

따라서 주요 질문은 단어 경계에서만 일치하기 위해 어떻게 동선을 작성해야합니까?

보조 질문은 PHP 응용 프로그램에서 UTF-8을 사용하고 싶다는 것을 Windows에게 알리는 방법입니다.

도움이 되었습니까?

해결책

UTF-8 모드에서도 표준 클래스 속도는 같은 것입니다 \w 그리고 \b 유니 코드 인식이 아닙니다. 운동을 할 때 유니 코드 속기를 사용해야하지만 대안 대신 룩 어라운드를 사용하여 조금 덜 못 생겼을 수 있습니다.

/(?<!\pL)weiß(?!\pL)/u

또한 유니 코드 클래스 속에서 곱슬 괄호를 남긴 방법에 주목하십시오. 클래스 이름이 단일 문자로 구성되면 그렇게 할 수 있습니다.

다른 팁

지금까지 내가 찾은 것입니다. 다음과 같은 검색 및 교체 패턴을 다시 작성함으로써 :

$before = '(^|[^\p{L}])';
$after = '([^\p{L}]|$)';
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weißbier'));
// Test some other cases:
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weiß'));
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weiß bier'));
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', ' weiß'));

원하는 결과를 얻습니다.

string 'weißbier' (length=9)
string 'weiss' (length=5)
string 'weiss bier' (length=10)
string ' weiss' (length=6)

Apache를 실행하는 내 Windows 컴퓨터와 Apache를 실행하는 호스팅 된 Linux 웹 서버에서.

나는 이것을하는 더 좋은 방법이 있다고 생각합니다.

또한 여전히 Windows 컴퓨터를 UTF-8로 설정하고 싶습니다.

이것이 관련된 것 같아요 버그 #52971

pcre-meta-arcaracters와 같은 \b \w 유니 코드 문자열로 작동하지 않습니다.

그리고 PHP 5.3.4에서 수정

PCRE 확장 : 버그 #52971을 수정했습니다 (PCRE-Meta-Characters는 UTF-8과 함께 작동하지 않습니다).

에 따르면 이 의견, 그것은 PHP의 버그입니다. 사용합니다 \W 대신에 \b 어떤 혜택이 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top