Странное поведение PHP UTF-8 - PullRequest
6 голосов
/ 11 ноября 2010

У меня есть следующий тестовый код PHP:

header('Content-type: text/html; charset=utf-8');

$text = 'Développeur Web';
var_dump($text);

$text = preg_replace('#[^\\pL\d]+#u', '-', $text);
var_dump($text);

$text = trim($text, '-');
var_dump($text);

$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
var_dump($text);

$text = strtolower($text);
var_dump($text);

$text = preg_replace('#[^-\w]+#', '', $text);
var_dump($text);

На моей локальной машине все работает как положено:

string(16) "Développeur Web" 
string(16) "Développeur-Web" 
string(16) "Développeur-Web" 
string(16) "D'eveloppeur-Web" 
string(16) "d'eveloppeur-web" 
string(15) "developpeur-web" 

но на моем живом сервере он ведет себя странно:

string 'Développeur Web' (length=16)
string '-pp-' (length=4)
string 'pp' (length=2)
string 'pp' (length=2)
string 'pp' (length=2)
string 'pp' (length=2)

Локальный компьютер - Windows с PHP версии 5.2.4, а работающий сервер - CentOS с PHP версии 5.2.10, поэтому они ни в коем случае не идентичны.

Кто-нибудь испытывал нечто подобное и может указать мне правильное направление? Я предполагаю, что это какая-то конфигурация сервера или PHP, связанная с UTF-8 или локалью.

Большое спасибо заранее

1 Ответ

2 голосов
/ 11 ноября 2010

Не должно ли быть

$text = preg_replace('#[^\pL\d]+#u', '-', $text);

в строке 6. Если вы не наберете \, у вас будет литерал \ в вашем классе исключения. Таким образом, регулярное выражение [^\\pL\d]+ находит одно или несколько вхождений символа, которые не являются \, p, L или цифрой. Это объясняет, почему "Développeur Web" будет уменьшено до "-pp-" - все до первых p совпадений и будет заменено на -; то же самое относится ко всему после второго p.

Возможно, существует разница между обеими машинами в том, как трактуется сбежавший \.

РЕДАКТИРОВАТЬ после комментария OP:

На самом деле экранирование \ здесь не проблема - обе версии обрабатываются одинаково. Проблема в том, что используемая версия PCRE не поддерживает свойства Unicode и не была скомпилирована с --enable-unicode-properties.

...