PHP:preg_replace在不同的服务器上有不同的行为

时间:2012-03-22 16:29:52

标签: php preg-replace

我正在使用一个PHP函数,该函数接受一个字符串并将其所有空格转换为下划线,将其所有重音字符转换为非重音字符,并删除非单词字符。换句话说,它会产生slu ..

此功能在我的本地计算机上正常运行,该计算机正在运行MAMP。我已经尝试过PHP 5.2.17和5.3.6,两者都没有问题。但是,在另一台运行PHP 5.2.10的服务器上,该函数的行为方式不同。

例如,在我的本地机器上,如果我传入字符串“this_is_a_test”,该函数将返回相同的字符串,因为没有空格,带重音的字符或非单词字符。但是,如果我在另一台服务器上传入相同的字符串,该函数将返回“t_t_t”。

我将本地计算机上的PHP 5.3.6的php.ini文件与另一台服务器上的php.ini文件进行了比较,并没有看到任何导致此类问题的差异。有任何想法吗?顺便说一句,它实际上是我正在使用的CakePHP项目,但我将代码缩小到这个测试用例,这是纯PHP:

<?php

    $map = array(
        '/ä|æ|ǽ/' => 'ae',
        '/ö|œ/' => 'oe',
        '/ü/' => 'ue',
        '/Ä/' => 'Ae',
        '/Ü/' => 'Ue',
        '/Ö/' => 'Oe',
        '/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ/' => 'A',
        '/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª/' => 'a',
        '/Ç|Ć|Ĉ|Ċ|Č/' => 'C',
        '/ç|ć|ĉ|ċ|č/' => 'c',
        '/Ð|Ď|Đ/' => 'D',
        '/ð|ď|đ/' => 'd',
        '/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě/' => 'E',
        '/è|é|ê|ë|ē|ĕ|ė|ę|ě/' => 'e',
        '/Ĝ|Ğ|Ġ|Ģ/' => 'G',
        '/ĝ|ğ|ġ|ģ/' => 'g',
        '/Ĥ|Ħ/' => 'H',
        '/ĥ|ħ/' => 'h',
        '/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ/' => 'I',
        '/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı/' => 'i',
        '/Ĵ/' => 'J',
        '/ĵ/' => 'j',
        '/Ķ/' => 'K',
        '/ķ/' => 'k',
        '/Ĺ|Ļ|Ľ|Ŀ|Ł/' => 'L',
        '/ĺ|ļ|ľ|ŀ|ł/' => 'l',
        '/Ñ|Ń|Ņ|Ň/' => 'N',
        '/ñ|ń|ņ|ň|ʼn/' => 'n',
        '/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ/' => 'O',
        '/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º/' => 'o',
        '/Ŕ|Ŗ|Ř/' => 'R',
        '/ŕ|ŗ|ř/' => 'r',
        '/Ś|Ŝ|Ş|Š/' => 'S',
        '/ś|ŝ|ş|š|ſ/' => 's',
        '/Ţ|Ť|Ŧ/' => 'T',
        '/ţ|ť|ŧ/' => 't',
        '/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ/' => 'U',
        '/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ/' => 'u',
        '/Ý|Ÿ|Ŷ/' => 'Y',
        '/ý|ÿ|ŷ/' => 'y',
        '/Ŵ/' => 'W',
        '/ŵ/' => 'w',
        '/Ź|Ż|Ž/' => 'Z',
        '/ź|ż|ž/' => 'z',
        '/Æ|Ǽ/' => 'AE',
        '/ß/' => 'ss',
        '/IJ/' => 'IJ',
        '/ij/' => 'ij',
        '/Œ/' => 'OE',
        '/ƒ/' => 'f',
        '/[^\s\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]/mu' => ' ',
        '/\s+/' => '_',
        '/^[_]+|[_]+$/' => ''
    );

    echo preg_replace(array_keys($map), array_values($map), 'this_is_a_test');

?>

2 个答案:

答案 0 :(得分:0)

看看你的字符集,确保它们在两个平台上都是一样的。

看起来你在你的slugs中将UTF-8转换为单字节字符格式。如果您的系统是ISO-8859-1,它会将您的密钥误解为每个UTF-8字符的多个字符。

这是在php.ini

中的default_charset中设置的

在cli中尝试:

php -i

答案 1 :(得分:0)

我通过更新PCRE解决了这个问题。