我有以下代码:
preg_replace('/[^'w-]/u','.','Bréánná MÓÚLÍN');
Which在服务器A (PHP 5.3.5)返回:
"Breanna。Móúlín"
"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();
}
}