2011-09-17 2 views
1

나는 다음과 같은 코드가 있습니다preg_replace, 문자가 이스케이프되고 악센트 부호가있는 문자/u는 하나 개의 서버에서 작동하지만 다른

preg_replace('/[^\w-]/u','.','Bréánná MÓÚLÍN'); 

서버 A (PHP 5.3.5)에 반환
"Bréánná.Móúlín"(예상대로)를

그러나, 서버 B에 (PHP 5.2.11)이 반환
"Br..n..M..ln"(안 내가 전혀 원하는)

바로 생각에 나는 오전 이것은 PCRE_UCP가 모든 것이 컴파일 될 때 설정되었는지 여부에 달려 있습니다.

이 경우 무시할 수있는 방법이 있습니까?

그런 문자를 '표준'문자로 쉽게 대체 할 수있는 방법이 있습니까?

답변

2

(utf8_decode하지만 더 광대처럼) 나는 컴파일시 정의 PCRE_UCPpreg_replace()에 영향을 미치는지 잘 모르겠지만, 문제에 대한 주위 작품은 멀티 바이트 문자열 기능 mb_ereg_replace() 사용하는 것입니다

<?php 
mb_internal_encoding("UTF-8"); 
mb_regex_encoding("UTF-8"); 

echo mb_ereg_replace('[^0-9A-Za-zÀ-ÖØ-öø-˿Ͱ-ͽͿ-῿‌-‍⁰-↏Ⰰ-⿯、-퟿豈-﷏ﷰ-�̀-ͯ‿-⁀\\-]','.','Bréánná MÓÚLÍN'); 

PHP 5.2 결과를 : http://codepad.viper-7.com/UnZeyf

편집 : 내가 원래 멀티 바이트 EREG 기능 Unicode character type escapes을 지원한다고 생각하지만,이 사실이 될하지 밝혀졌습니다. 대신, "문자"라고 생각하는 문자의 범위를 결정해야합니다.

import java.io.*; 

public class SO7456963 { 
    public static void main(String[] args) throws Throwable { 
     Writer w = new OutputStreamWriter(new FileOutputStream("SO7456963.txt"), "UTF-8"); 
     w.write("[^0-9A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u0300-\u036F\u203F-\u2040\\\\-]"); 
     w.close(); 
    } 
} 
+0

흥미 내가 대체하려고 해요 : 나는 (분명히 멀티 바이트 EREG 기능 중 하나, 유니 코드 문자 이스케이프 시퀀스를 지원하지 않는) 문자가 정규식 문자열을 생성하기 위해 다음과 같은 자바 프로그램으로 XML Standard's definition of NameChar 범위 사용 비 단어 문자 (하이픈이 아닌 문자)도. 그러나 그 코드는 성취하지 못합니다. \\ pL 및 \\ pN은 무엇입니까? 나는 그들에게 익숙하지 않아서 내가 원하는 것을하기 위해 그것을 어떻게 바꿀 지 모른다. –

+0

@Toukakoukan : 유니 코드 속성에 따라 문자 집합을 지정합니다. 참조 : http://www.php.net/manual/en/regexp.reference.unicode.php –

+0

@Toukakoukan : 멀티 바이트 ereg 함수가 특별한'\ p {...}'PCRE를 지원하지 않는다는 것을 알았습니다. 유니 코드 속성으로 문자를 지정하는 구문입니다. 내 업데이트 답변을 참조하십시오. –