• User

    caratteri accentati e str_replace

    Ciaooo!
    devo metter su un semplice form di contatti. Il problema si presenta quando scrivo caratteri accentati, che codifica in simboli strani.
    Ho letto che esiste la funzione str_replace ma non riesco a usarla. :arrabbiato:

    ecco il codice del sendmail:

    
        
        /*
          * YOUR EMAIL ***
        */
        
        $adminEmail = "[email protected]";
        $subject = "Nuova mail";
        
        
        /*
          * VALIDATE EMAIL ***
        */
        
        
        function validateEmail($email){
            return eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email);
        }
        
        
        /*
          * CHECK FORM ***
        */
        
        
        $post = (!empty($_POST)) ? true : false;
        
        if($post) {
            
            $nome = stripslashes($_POST['name']);
            $cognome = stripslashes($_POST['cognome']);
    
            $message = "";
           
            $message .= "Nome: ".$name."\n";
            $message .= "Cognome: ".$cognome."\n";
            $message .= "Messaggio: ".stripslashes($_POST['message']);
            
            $message = str_replace(array("à", "a"), '', $_POST['message']);
            /* codice che dovrebbe sostituire i caratteri accentati */
    
            $error = '';
            
            
            /*
              * CHECK MESSAGE ***
            */
            
            
            if(!$message) {
                $error = "Please, type in a message.";
            }
    
            
            /*
              * CHECK MAIL ***
            */
    
            if($email && !validateEmail($email)) {
                $error = "Please, check your e-mail address.";
            }
            
            
            /*
              * CHECK NAME ***
            */
            
            
            if(!$name) {
                $error = "Please, type in your name.";
            }
            
            
            /*
              * ACTION ***
            */
            $headers = "From: ".$name." <".$email.">\r\n"
                        ."Reply-To: ".$email."\r\n"
                        ."X-Mailer: PHP/" . phpversion();
            
            if(!$error) {
                //WEBMASTER_EMAIL
    
                $mail = mail($adminEmail, $subject, $message, $headers);
    
                if($mail) {
                    echo 'ok';
                }
            } else {
                echo '<p>'.$error.'</p>';
            }
            
            
        }
    
    
    

  • ModSenior

    Ciao mrblade,
    credo che ti venga più comodo utilizzare la funzione htmlentities in questo caso.


  • User

    Non vorrei dire una minch***a ma sembra che il server dove è hostato il sito non abbia a disposizione il charset appropriato.
    Il problema è che apparte gli accenti, il form verrà compilato anche in russo, e quindi con tutti i suoi caratteri...
    Con il replace potrei sostituire i caratteri accentati con lettere normali...


  • User Attivo

    @mrblade said:

    con il replace potrei sostituire i caratteri accentati con lettere normali...
    @Samyorn said:

    PHP 4, 5
    Sintassi: mixed str_replace (mixed $search, mixed $replace, mixed $subject[, int $count])

    str_replace è una funzione di PHP che restituisce una stringa, o una matrice, sostituendo il valore (o i valori come vedremo di seguito) del parametro $replace a tutte le occorrenze $search contenute in $subject.

    
    <?
    $str = 'Questo è un esempio';
    $str = str_replace('un esempio', 'PHP', $str);
    echo $str; // risultato: Questo è PHP
    ?>
    

    Dalla versione 5.0.0 di PHP è stato introdotto il parametro $count che restituisce il numero di occorrenze $search sostituite con il parametro $replace in $subject.

    
    <?
    $str = 'Mollo';
    $str = str_replace ('l', 't', $str, $count);
    echo $count; // risultato: 2
    ?>
    

    I parametri $search , $replace ed $subject possono essere anche degli array.
    Qualora $subject fosse un array verranno sostituite tutte le occorrenze di ogni elemento di $subject.

    
    <?
    $str[0] = 'Mollo';
    $str[1] = 'Bollo';
    $str = str_replace ('ll', 'tt', $str);
    echo $str[0]; // risultato: Motto
    echo $str[1]; // risultato: Botto
    ?>
    

    Se $search è un'array, ogni elemento dell'array verrà sostituito con il parametro $replace:

    
    <?
    $str = 'Questo è un esempio';
    $voc = array ('a', 'e', 'i', 'o', 'u');
    $str = str_replace ($voc, '', $str);
    echo $str; // risultato: Qst è n smp
    ?>
    

    Qualora $search ed $replace siano degli array con eguale numero di elementi, questi verranno sostituiti mantenendo l'ordine degli elementi che li costituiscono. Se gli elementi di $replace sono inferiori a quelli di $search, i rimanenti elementi di $search verranno sostituiti con stringhe vuote.

    
    <?
    $str = 'Bevo tanta acqua, poco vino e mangio sempre';
    $search = array ('tanta', 'poco', 'mangio');
    $replace = array ('poca', 'molto', 'corro');
    $str = str_replace ($search, $replace, $str);
    echo $str; // risultato: Bevo poca acqua, molto vino e corro sempre :D
    
    $str = 'Bevo tanta acqua, poco vino e mangio sempre';
    $search = array ('tanta', 'poco', 'sempre');
    $replace = array ('poca', 'molto');
    $str = str_replace ($search, $replace, $str);
    echo $str; // risultato: Bevo poca acqua, molto vino e mangio
    ?>
    

    Questa funzione è case sensitive pertanto il seguente codice potrebbe produrre risultati inaspettati:

    
    $str = 'Questo è un esempio';
    $voc = array ('a', 'E', 'i', 'O', 'u');
    $str = str_replace ($voc, '', $str);
    echo $str; // risultato: Qesto è n esempo
    ?>
    

    L?equivalente, non case sensitive, di questa funzione è str_ireplace();

    http://www.giorgiotave.it/forum/funzioni-di-php/66300-stringhe-str_replace.html


  • User

    Io ho fatto così ma senza risultato, continua a inviare simboli strani:

    
    $message .= "Nome ".$name."\n";
    $message .= "Messaggio ".stripslashes($_POST['message']);  
    
    $search = array('à', 'è');
    $replace = array ('a', 'e');
    $message = str_replace($search, $replace, $message);
    
    

  • User Attivo

    Ciao mrblade,
    Il fatto che visualizzi i caratteri in quel modo dipende dall'utilizzo di caratteri del charset utf-8 (i caratteri accentati), con una pagina che non è dichiarata come charset utf-8.
    Inoltre la str_replace non risolve il problema perché non è compatibile con quel charset.

    Innanzitutto, visto che dovrai utilizzare i caratteri cirillici, hai due strade:

    La prima consiste nel trasformare tutto in utf-8.
    Per farlo devi impostare il charset utf-8 sulla pagina html con il tag:
    [html]<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />[/html]In secondo luogo devi accertarti di utilizzare solamente funzioni compatibili utf-8.
    In più, se utilizzi dei database, è meglio impostare il db in utf-8 ed eseguire per prima cosa la query "SET NAMES UTF-8" subito dopo ogni connessione al database.

    L'alternativa a tutto questo è utilizzare la funzione htmlentities, come ti è stato suggerito da TheDarkITA, che trasforma i caratteri speciali in entità html, come ad esempio la trasformazione da "à" a "à".
    Nel tuo caso la seconda opzione è la più semplice e immediata e tutto si risolverebbe con:
    [php]$message .= "Nome ".$name."\n";
    $message .= "Messaggio ".htmlentities(stripslashes($_POST['message'])); [/php]Un saluto,
    Luca Bartoli