2011-09-17 18 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?

如果出現這種情況,有什麼方法可以重寫?

失敗了,有沒有什麼方法可以很容易地用'標準'替換這些字符? (像utf8_decode更廣闊)

回答

2

我不知道編譯時的定義PCRE_UCP是否影響preg_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

編輯:我原本以爲多字節額日格功能支持Unicode character type escapes,但事實證明這是不正確的。相反,您需要確定您認爲是「字母」的字符範圍。我使用的字符從XML Standard's definition of NameChar與以下Java程序生成的正則表達式的字符串的範圍(如明顯多字節額日格功能,不支持Unicode字符轉義序列,這是):

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

有趣的是,我試圖取代非單詞字符(非連字符)與。然而,哪個代碼沒有完成。什麼是\\ pL和\\ pN?我不熟悉它們,所以我不知道如何改變它來做我想做的事。 –

+0

@Toukakoukan:它們通過Unicode屬性指定字符集。請參閱:http://www.php.net/manual/en/regexp.reference.unicode.php –

+0

@Toukakoukan:我發現多字節ereg函數不支持特殊的'\ p {...}'PCRE用於通過Unicode屬性指定字符的語法。看到我更新的答案。 –

相關問題