【问题标题】:preg_replace, character escapes & accented characters. /u works on one server, but not anotherpreg_replace、字符转义和重音字符。 /u 适用于一台服务器,但不适用于另一台服务器
【发布时间】:2011-11-19 09:28:39
【问题描述】:

我有以下代码:

 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..l.n”(根本不是我想要的)

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

如果是这种情况,有什么方法可以覆盖它吗?

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

【问题讨论】:

    标签: php regex utf-8 pcre


    【解决方案1】:

    我不确定在编译期间定义的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

    编辑:我原本以为多字节 ereg 函数支持Unicode character type escapes,但事实证明并非如此。相反,您需要确定您认为是“字母”的字符范围。我使用 XML Standard's definition of 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();
        }
    }
    

    【讨论】:

    • 有趣的是,我正在尝试用 .但是,该代码没有完成。 \\pL 和 \\pN 是什么?我对它们不熟悉,所以我不知道如何改变它来做我想做的事情。
    • @Toukakoukan:他们通过 Unicode 属性指定字符集。见:php.net/manual/en/regexp.reference.unicode.php
    • @Toukakoukan:我发现多字节 ereg 函数不支持通过 Unicode 属性指定字符的特殊 \p{...} PCRE 语法。请参阅我的更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2019-10-22
    • 1970-01-01
    相关资源
    最近更新 更多