2010-11-11 17 views
6

Ho il seguente codice di prova PHP:Strano PHP UTF-8 Comportamento

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

sulla mia macchina locale che sta funzionando come previsto:

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"

ma sul mio server dal vivo E 'comporta in modo strano:

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)

Il computer locale è Windows che esegue PHP versione 5.2.4 e il server live è CentOS con PHP versione 5.2.10 in modo non sono identici con nessun mezzo, non sono ideali, lo so.

Qualcuno ha sperimentato qualcosa di simile e può indicarmi la giusta direzione? Presumo che si tratti di una sorta di server o configurazione PHP relativa a UTF-8 o locale.

Molte grazie in anticipo

+0

Strano. Non sono eccezionale con Regexes, puoi approfondire cosa sta facendo quel primo preg_replace() thingy? –

+0

Inizialmente pensavo a 'mb_default_encoding()' ma quella libreria non ha alcuna connessione con le funzioni 'preg_ *'. –

+0

La prima espressione regolare dovrebbe sostituire la lettera o le cifre con "-" viene da un tutorial di Symfony http://www.symfony-project.org/jobeet/1_4/Doctrine/en/08 –

risposta

2

Non dovrebbero essere

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

in linea 6. Se si sfuggire alla \ avrete un letterale \ nella classe di esclusione. Quindi la regex [^\\pL\d]+ trova una o più occorrenze di un carattere che non è uno \, p, L o una cifra. Questo spiegherebbe perché "Développeur Web" sarà ridotto a "-pp-" - tutto fino alle prime partite p e sarà sostituito da un -; lo stesso vale per tutto dopo il secondo p.

Forse c'è una differenza tra entrambe le macchine nel modo in cui viene trattato un documento con escape \.

EDIT dopo il commento OP:

realtà sfuggire al \ non è un problema qui - entrambe le versioni sono trattati allo stesso modo. Ciò che in realtà sembra essere il problema è che la versione PCRE utilizzata non supporta le proprietà unicode e non è stata compilata con --enable-unicode-properties.

+0

Ho sostituito il pattern come suggerito e non sto ancora ottenendo il risultato desiderato. –

+0

L'ho esaminato io stesso e penso che potrebbe avere qualcosa a che fare con PCRE .. ancora guardando ora. –

+0

pcretest -C versione PCRE 6.6 06-Feb-2006 compilato con supporto UTF-8 proprietà No Unicode supportano carattere Newline è LF dimensioni Link interni = 2 POSIX soglia malloc = partita 10 predefinito limite limite = 10000000 default profondità di ricorsione = 10000000 Combinare lo stack utilizza la ricorsione –