Domanda

Ho trovato una semplice funzione per rimuovere alcuni caratteri indesiderati da una stringa.

function strClean($input){

$input = strtolower($input);
$b = array("á","é","í","ó","ú", "ñ", " "); //etc...
$c = array("a","e","i","o","u","n", "-"); //etc...

$input = str_replace($b, $c, $input);

return $input;
}

Quando lo uso su accenti o altri personaggi, come questa parola 'á é ñ í' stampa quei punti interrogativi o caratteri strani, come: output http://img217.imageshack.us/img217/6794/59472278.jpg

Nota: sto usando strclean.php (che contiene questa funzione) e index.php, entrambi in UTF-8. index.php ha il seguente aspetto:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
</head>
<body>
    <?php
    include('strclean.php');

    echo 'óóóáà';
    echo strClean('óóóáà');


    ?>
</body>
</html>

Cosa sto sbagliando?

È stato utile?

Soluzione

Ho testato il tuo codice e l'errore è nella funzione strtolower ...

Sostituiscilo con mb_strtolower, come muggito

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>

<?php
    function strClean($input) {
        $input = mb_strtolower($input, 'UTF-8');
        $b = array("á","é","í","ó","ú", "n", " ");
        $c = array("a","e","i","o","u","n", "-");
        return str_replace($b, $c, $input);
    }

    $string = 'á é í ó ú n abcdef ghij';
    echo $string ."<br />". strClean($string);
?>

</body>
</html>

Altri suggerimenti

Usa

iconv('UTF-8', 'ASCII//TRANSLIT', $input);

Potresti provare iconv .

Si verifica una sostituzione, ovvero ottieni gli stessi strani caratteri quando stampi prima $ input? In tal caso, i set di caratteri del file di codice sorgente PHP e l'input non corrispondono e potrebbe essere necessario utilizzare iconv () sull'input prima di sostituirlo.

modifica: ho preso entrambi i tuoi file, li ho caricati sul mio server web e la stampa e la pulizia funzionano bene (vedi http://www.tag-am-meer.com/test1/ ). Questo è su PHP 4.4.9 e Firefox 3.0.6. Altri potenziali problemi che mi vengono in mente:

  • Funziona per te su Firefox? Ricordo vagamente che IE6 (e probabilmente anche le versioni successive) si aspettano che il set di caratteri nella sezione head HTML sia scritto in minuscolo (" utf-8 ")
  • Il tuo editor include segni di ordine dei byte (BOM) nei file di codice? Il mio no, forse PHP soffoca su quelli.
  • Puoi guardare le intestazioni HTTP per vedere se sta succedendo qualcosa di insolito, come un cattivo tipo MIME? Il componente aggiuntivo Tamper Data per Firefox può aiutarti in questo.

Perché vuoi rimuovere gli accenti? È possibile che tu voglia semplicemente ignorarli? In tal caso, questa risposta ha una soluzione Perl che dimostra come farlo. Si noti che il Perl è in una lingua straniera. :)

Mi sono trovato con questo problema prima, e ho provato a seguire i lead di questo post e altri che ho trovato sulla strada e non c'era una soluzione semplice, perché devi conoscere il set di caratteri che il tuo sistema utilizza (nel mio caso ISO-8859-1) e questo è quello che ho fatto:

    function quit_accenture($str){
      $pattern = array();
      $pattern[0] = '/[Á|Â|À|Å|Ä]/';
      $pattern[1] = '/[É|Ê|È]/';
      $pattern[2] = '/[Í|Î|Ì|Ï]/';
      $pattern[3] = '/[Ó|Ô|Ò|Ö]/';
      $pattern[4] = '/[Ú|Û|Ù|Ü]/';
      $pattern[5] = '/[á|â|à|å|ä]/';
      $pattern[6] = '/[ð|é|ê|è|ë]/';
      $pattern[7] = '/[í|î|ì|ï]/';
      $pattern[8] = '/[ó|ô|ò|ø|õ|ö]/';
      $pattern[9] = '/[ú|û|ù|ü]/';
      $replacement = array();
      $replacement[0] = 'A';
      $replacement[1] = 'E';
      $replacement[2] = 'I';
      $replacement[3] = 'O';
      $replacement[4] = 'U';
      $replacement[5] = 'a';
      $replacement[6] = 'e';
      $replacement[7] = 'i';
      $replacement[8] = 'o';
      $replacement[9] = 'u';
      return preg_replace($pattern, $replacement, $str);
    }
    $txt = 

Mi sono trovato con questo problema prima, e ho provato a seguire i lead di questo post e altri che ho trovato sulla strada e non c'era una soluzione semplice, perché devi conoscere il set di caratteri che il tuo sistema utilizza (nel mio caso ISO-8859-1) e questo è quello che ho fatto:

<*>

Questo ha funzionato per me, ma penso anche che sia il modo giusto :)

POST['your_htmled_text']; //Convert to your system's charset. I checked this on the php.ini $txt = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $txt); //Apply your function $txt = quit_accenture($txt); //output print_r($txt);

Questo ha funzionato per me, ma penso anche che sia il modo giusto :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top