Pergunta

Eu encontrei uma função simples para remover alguns caracteres indesejados de uma string.

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 eu usá-lo em acentos ou outros caracteres, como esta palavra 'um e n i' ele imprime esses pontos de interrogação ou caracteres estranhos, tais como: saída http://img217.imageshack.us/img217/6794/59472278.jpg

Nota: eu estou usando strclean.php (que contém essa função) e index.php, tanto em UTF-8. olhares index.php da seguinte forma:

<!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>

O que estou fazendo de errado?

Foi útil?

Solução

Eu testei seu código, e erro é em função strtolower ...

Substitua-o por mb_strtolower, como abaixo

<!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>

Outras dicas

Use

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

Você pode querer tentar iconv .

Será que a substituição aconteça em tudo, ou seja, você recebe os mesmos caracteres estranhos quando você imprimir $ input de antemão? Se assim for, os conjuntos de caracteres de seu arquivo de código fonte do PHP e a entrada não correspondem e você pode precisar usar iconv () na entrada antes de substituir.

Editar: Eu levei tanto de seus arquivos, carregado los para o meu servidor web e impressão e limpeza funciona bem (veja http://www.tag-am-meer.com/test1/ ). Esta é em PHP 4.4.9 e Firefox 3.0.6. Mais problemas potenciais que vêm à minha mente:

  • Será que funciona para você no Firefox? Lembro-me vagamente que IE6 (e provavelmente em versões posteriores também) esperar que o charset na seção head de HTML para ser escrito em letras minúsculas ( "utf-8")
  • Será que o seu editor incluem marcas de ordem de bytes (BOM) nos arquivos de código? O meu não, talvez PHP engasga com aqueles.
  • Você pode olhar para o cabeçalhos HTTP para ver se há algo incomum acontecendo, como um tipo de MIME ruim? O Tamper Data add-on para o Firefox pode ajudar com isso.

Por que você deseja remover acentos? É possível que você só quer ignorá-los? Se assim for, esta resposta tem uma solução Perl que demonstra como fazer isso. Note que o Perl está em uma língua estrangeira. :)

Eu encontrei-me com este problema antes, e eu tentei seguir as pistas deste post e outros que encontrei no caminho e não havia solução simples, porque você tem que saber o charset que usa seu sistema (no meu caso ISO-8859-1) e é isso que eu fiz:

    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 = $_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);

Isso funcionou para mim, mas eu também acho que é o caminho certo:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top