Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di jeppox
    Registrato dal
    Mar 2007
    Messaggi
    436

    preg_replace(), UTF-8 e segni particolari

    Salve,

    qualcuno mi saprebbe spiegare dove sbaglio? Voglio infatti sostituire dei segni particolari di uno string con "_", Per es. in un Uploader in cui lo user carica un file, nel mio caso specifico si tratta di un sistema Mac OS X, si vuole evitare l'uso di segni particolari. Tipo un File del genere: myfile/../...jpg

    Ora pur avendo tutto settato in UTF-8, DB, Editor ed header (charset), preg_replace() ma anche str_replace() continuano ad ignorare i segni particolari come pure le Umlaute, faccio un esempio:

    Codice PHP:
    $str "Müller"// variabile viene inviata quale parametro in una funzione 
    Codice PHP:
    echo preg_replace('/\[^\pL]/u''_'$str ); // Visualizza erroneamente: Müller formato UTF-8 
    Codice PHP:
    echo utf8_encode(preg_replace('/\[^\pL]/u''_'utf8_decode($str) )); // Visualizza erroneamente: M?ller formato ASCII 

    Entrambi gli esempi non danno i risultati da me sperati. L'unico caso in cui preg_replace() funziona, è quando lo string lo inserisco manualmente hardcoded direttamente nella funzione:
    Codice PHP:
    echo preg_replace('/\[^\pL]/u''_''Müller' ); // Visualizza correttamente: M_ller 

    Devo forse settare qualcosa in php.ini? Questi sono i parametri settati:

    codice HTML:
    Multibyte Support     enabled
    Multibyte string engine     libmbfl
    HTTP input encoding translation     disabled
    libmbfl version     1.3.2 
    Multibyte (japanese) regex support     enabled
    Multibyte regex (oniguruma) backtrack check     On
    Multibyte regex (oniguruma) version     4.7.1
    Directive    Local Value    Master Value
    mbstring.detect_order    no value    no value
    mbstring.encoding_translation    Off    Off
    mbstring.func_overload    0    0
    mbstring.http_input    pass    pass
    mbstring.http_output    pass    pass
    mbstring.http_output_conv_mimetypes    ^(text/|application/xhtml\+xml)    ^(text/|application/xhtml\+xml)
    mbstring.internal_encoding    no value    no value
    mbstring.language    neutral    neutral
    mbstring.strict_detection    Off    Off
    mbstring.substitute_character    no value    no value

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Cosa fa [^\pL] ? Ho cercato in rete ma le spiegazioni non erano chiare.

    Puoi forse cavartela con print preg_replace('/[^a-zA-Z0-9_]/u', '_', $str );
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Utente di HTML.it L'avatar di jeppox
    Registrato dal
    Mar 2007
    Messaggi
    436
    Ciao badaze,


    in realtà preferisco una RegExp "classica" come mi hai consigliato. Credo che con [^\pL] si accettino tutti i caratteri a dipendenza della lingua selezionata, il mio è stato un tentativo. Qui trovi una spiegazione migliore: http://de2.php.net/manual/en/regexp....ce.unicode.php


    Il mio ultimo test ha dato quanto segue, purtroppo le Umlaute vengono ancora riconosciute come segni particolari, sebbene io le abbia esplicitamente acconsentite:

    Codice PHP:
    //$name ="(Müller).jpg";echo "bin2hex: ".bin2hex($name)."\r\n";             // 284d75cc886c6c6572292e6a7067echo "detect1: ".mb_detect_encoding($name)."\r\n";  // Visualizza: UTF-8echo "Visualizza prima: ".$name."\r\n";               // Visualizza: Müller.jpeg$name = preg_replace('/[^A-Za-z0-9  öäü éàè ÖÄÜ ÉÀÈ ._ -]/ui', '_', $name );echo "detect2: ".mb_detect_encoding($name)."\r\n";  // Visualizza: ASCIIecho "Visualizza dopo: ".$name."\r\n";              // Visualizza: _Mu_ller_.jpg 
    Se la variabile $name anzi che bypassarla tramite un metodo la edito direttamente nello Skript, allora funziona, non capisco.

  4. #4
    Utente di HTML.it L'avatar di jeppox
    Registrato dal
    Mar 2007
    Messaggi
    436
    Ciao badaze,


    in realtà preferisco una RegExp "classica" come mi hai consigliato. Credo che con [^\pL] si accettino tutti i caratteri a dipendenza della lingua selezionata, il mio è stato un tentativo. Qui trovi una spiegazione migliore: http://de2.php.net/manual/en/regexp....ce.unicode.php


    Il mio ultimo test ha dato quanto segue, purtroppo le Umlaute vengono ancora riconosciute come segni particolari, sebbene io le abbia esplicitamente acconsentite:


    Codice PHP:
    //$name ="(Müller).jpg";echo "bin2hex: ".bin2hex($name)."\r\n";             // 284d75cc886c6c6572292e6a7067echo "detect1: ".mb_detect_encoding($name)."\r\n";  // Visualizza: UTF-8echo "Visualizza prima: ".$name."\r\n";               // Visualizza: Müller.jpeg$name = preg_replace('/[^A-Za-z0-9  öäü éàè ÖÄÜ ÉÀÈ ._ -]/ui', '_', $name );echo "detect2: ".mb_detect_encoding($name)."\r\n";  // Visualizza: ASCIIecho "Visualizza dopo: ".$name."\r\n";              // Visualizza: _Mu_ller_.jpg 

    Se la variabile $name anzi che bypassarla tramite un metodo la edito direttamente nello Skript, allora funziona, non capisco.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.