2010-11-11 7 views
6

Tengo el siguiente código PHP de prueba:extraño PHP UTF-8 Comportamiento

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);

en mi máquina local está funcionando como se esperaba:

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"

pero en mi servidor vivo Es un comportamiento extraño:

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)

La máquina local es Windows que ejecuta PHP versión 5.2.4 y el servidor en vivo es CentOS con PHP versión 5.2.10 no son idénticos de ninguna manera, no lo sé ideal.

¿Alguien ha experimentado algo similar y puede orientarme en la dirección correcta? Supongo que es algún tipo de servidor o configuración de PHP relacionada con UTF-8 o configuración regional.

Muchas gracias de antemano

+0

Extraño. No soy genial con Regexes. ¿Puedes explicar qué está haciendo esa primera cosa preg_replace()? –

+0

Inicialmente pensé en 'mb_default_encoding()' pero esa biblioteca no tiene conexión con las funciones 'preg_ *'. –

+0

La primera expresión regular debe reemplazar no letras o dígitos con "-" viene de un tutorial de Symfony http://www.symfony-project.org/jobeet/1_4/Doctrine/en/08 –

Respuesta

2

¿No debería ser

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

en la línea 6. Si a escapar de la \ tendrá un literal \ en su clase de exclusión. Por lo tanto, la expresión regular [^\\pL\d]+ encuentra una o más apariciones de un carácter que no es \, p, L o un dígito. Esto explicaría por qué "Développeur Web" se reducirá a "-pp-" - todo hasta las primeras p coincide y será reemplazado por un -; lo mismo es cierto para todo después del segundo p.

Quizás haya una diferencia entre ambas máquinas en cómo se trata un escape \.

EDITAR después comentario OP:

En realidad escapar de la \ no es un problema aquí - ambas versiones son tratados de la misma manera. Lo que realmente parece ser el problema es que la versión PCRE utilizada no admite propiedades Unicode y no se compiló con --enable-unicode-properties.

+0

He reemplazado el patrón como sugirió y todavía no estoy obteniendo el resultado deseado. –

+0

He estado investigando por mi cuenta y creo que puede tener algo que ver con PCRE ... sigue buscando ahora. –

+0

pcretest -C PCRE versión 6.6 06-Feb-2006 Compilado con soporte UTF-8 propiedades Sin Unicode soportan carácter de nueva línea es LF tamaño Enlace interno = 2 POSIX umbral malloc = partido 10 predeterminado límite límite = 10000000 nivel de recursividad defecto = 10000000 La recursión de coincidencias utiliza la pila –