Preg_replace,字符转义&重音字符./u可以在一个服务器上工作,但不能在另一个服务器上工作


preg_replace, character escapes & accented characters. /u works on one server, but not another

我有以下代码:

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

Which在服务器A (PHP 5.3.5)返回:
"Breanna。Móúlín"

然而,在服务器B (PHP 5.2.11)上,它返回:
"Br . . n . . M . . l。n" (not what what I want all)

我是否认为这取决于PCRE_UCP是否在编译时设置?

如果是这种情况,有没有办法重写这个?

如果做不到这一点,是否有任何方法可以轻松地将这些字符替换为"标准"等价物?(类似于utf8_decode,但更广泛)

我不确定在编译期间定义的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 results: http://codepad.viper-7.com/UnZeyf

EDIT:我最初认为多字节ereg函数支持Unicode字符类型转义,但事实并非如此。相反,您需要确定您认为是"字母"的字符范围。我使用了XML标准对NameChar的定义中的字符范围和以下Java程序来生成RegExp字符串(因为显然多字节ereg函数也不支持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();
    }
}