Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Juninho De Luca_54619

Problema com str_replace

Recommended Posts

Olá pessoal,

Novamente aqui com um pepinão.

Graças a Deus existe o Fórum iMasters pra colocar a gente novamente na rodovia.

Meu problema é o seguinte: eu desenvolvi um padrãozinho de str_replace() pra converter caracteres especiais, tipo á, é, Á, É... que eventualmente façam parte do field 'descricao' enviados pelo form. Para isso, fiz dois arrays (reduzi muito o código pra deixa apenas onde o problema aparece):

 

//Array dos caracteres especiais
$special_char = array('á', 'é', 'A', 'É');

//Array das entidades
$html_ent = array('á', 'é', 'Á', 'É');

$string_to_form = mysql_real_escape_string(str_replace($special_char, $html_ent, $_POST['descricao']));

// A palavra 'até' entraria no DB como 'até'
// No view, o str_replace() inverteria isso, mais ou menos como uso sempre no . e , para unidades monetárias.

Aí... quando fiz esse teste, funcionou (mais ou menos, na verdade, com uma ou outra ressalva no uso do mysql_real_escape_string() x str_replace()... mas funfou).

Só que quando foi ajustar para o usar com arrays, if() e for() descambou tudo hehehehe

 

//Array dos caracteres especiais
$special_char = array('á', 'é', 'A', 'É');

//Array das entidades
$html_ent = array('á', 'é', 'Á', 'É');

// usr == 01 >> ADILSON
if ($usr == '01'){
$usrtbl = 'adilson';
for ($i=1; $i<=21; $i++) {

	// Busca a variavel do formulario
	$string_to_form_[$i] = mysql_real_escape_string(str_replace($special_char, $html_ent, $_POST['descricao-'.$i]));

	// Query
	$qry_form = "UPDATE $usrtbl SET
		$usrtbl.DESCRICAO='$string_to_form_[$i]'
	WHERE $usrtbl.ID='$i'";

	mysql_query($qry_form, $con) or die(mysql_error());
}
}

 

Simplesmente parou de funcionar!!! Tentei jogar os arrays como variáveis $i para dentro do for(), mas não funcionou também. Tentei tirar o mysql_real_escape_string(). Nada. Ele continua gravando Á, é, á, É no banco e não as entidades html como no teste.

 

Aí dei uma olhada nos posts antigos aqui do fórum e encontrei isso na forma de função. Aí fiz:

 

function chars_to_ent($str) {

$html_ent = array('Á', 'É');	
$special_chars = array('Á', 'É');	

return str_replace($special_chars, $html_ent, $str);

}

$string_to_form_[$i] = chars_to_ent($_POST['descricao-'.$i]);

 

E... nada. Alguém sabe onde estou errando?

 

Putz.. nem uma visualização ainda hehe =]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como se trata de uma array, acredito que tenha que informar o número do array no índice. Lembrando que array começa com o número 0.

 

str_replace($special_char[0], $html_ent[0], $_POST['descricao']));

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas no caso eu utilizo a variável $i para limitar o número de loops do for(). Faria $special_char[$i]?

Vou tentar aqui! Valeu Sam!

 

Tentei com

 

str_replace($special_char[$i], $html_ent[$i], $_POST['descricao']);

 

mas não funcionou =(

 

Veja se é isto que você quer e adapite ao sua necessidade. Apesar de eu ser novato em PHP consegui excutar aqui e deu certo:

 

//Caracteres especiais
$special_char = array('á', 'é', 'A', 'É');

//Array das entidades
$html_ent = array('á', 'é', 'Á', 'É');

//Texto a ser trocado
$texto = "José Mário";

//loop até o total de arrays
for ($i=0; $i<count($special_char); $i++) {
  //verifica se o caractere existe no texto
  $pos = strpos($texto, $special_char[$i]);

  //se existir então substitua. a função htmlspecialchars() é para mostrar o $html_ent e não o carcatere acentuado
  if ($pos > 0) {
      $texto = str_replace($special_char[$i], htmlspecialchars($html_ent[$i]), $texto);
  }
}

//mostra o resultado
echo "[".$texto."]";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Sam... testei aqui. Funciou na forma como você mandou.

 

Mas eu não posso usar

 

$i<count($special_char);

 

porque cada user possui um número diferente de campos e esses campos são definidos por esse $i < 21.

 

Além disso, quando começo a trabalhar com variável $i, o processo para de funfar.

 

Tipo:

 

$texto_para_db_[$i] = str_replace($special_chars[$i], htmlspecialchars($html_ent[$i]), $_POST['descricao-'.$i]);

 

Aí já não funciona mais ahhhhhhhhhhh insere o Á no db... e eu queria o Á =P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então... já tentei das seguintes formas:

 

$html_ent = array("Á", "á");
$chars = array("Á", "á");

$descricao = str_replace($chars, $html_ent, $_POST['DESCRICAO-'.$i]);
echo $descricao;

 

Assim:

 

function chars_to_ent($str) {

  $html_ent = array("Á", "á");
  $chars = array("Á", "á");
  return str_replace($chars, $html_ent, $str);
}

echo chars_to_ent($_POST['DESCRICAO-'.$i]);

 

E assim:

 

function chars_to_ent($str) {

   $new_str = $str; 
   $new_str = str_replace('á', 'á', $new_str);
   $new_str = str_replace('Á', 'Á', $new_str);
   return $new_str;

   }

echo chars_to_ent($_POST['DESCRICAO-'.$i]);

 

Nenhuma das formas funcionou. Não tenho mais nenhuma opção. Alguém me dá uma luz?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então... já tentei das seguintes formas:

 

$html_ent = array("Á", "á");
$chars = array("Á", "á");

$descricao = str_replace($chars, $html_ent, $_POST['DESCRICAO-'.$i]);
echo $descricao;

 

Assim:

 

function chars_to_ent($str) {

  $html_ent = array("Á", "á");
  $chars = array("Á", "á");
  return str_replace($chars, $html_ent, $str);
}

echo chars_to_ent($_POST['DESCRICAO-'.$i]);

 

E assim:

 

function chars_to_ent($str) {

   $new_str = $str; 
   $new_str = str_replace('á', 'á', $new_str);
   $new_str = str_replace('Á', 'Á', $new_str);
   return $new_str;

   }

echo chars_to_ent($_POST['DESCRICAO-'.$i]);

 

Nenhuma das formas funcionou. Não tenho mais nenhuma opção. Alguém me dá uma luz?

 

Eae cara beleza?

 

Tenta isso aqui

 

<?php
/*
ã = ã
á = á
à  = à
â = â
ª = ª
ÃÀ = ÁÀ
 = Â
à = Ã
É = É
È = È
Ê = Ê
é = é
è = è
ê = ê
Ó = Ó
Ã’ = Ò
Ô = Ô
Õ = Õ
ó = ó
ò = ò
ô = ô
õ = õ
º = º
Ú = Ú
Ù = Ù
Û = Û
ú = ú
ù = ù
û = û
Ç = Ç
ç = ç
*/

function trata($var) {

// Letra (A) menuscula
$var = str_replace ("ã","a",$var);
$var = str_replace ("á","a",$var);
$var = str_replace ("Ã ","a",$var);
$var = str_replace ("â","a",$var);
$var = str_replace ("ª","a",$var);

// Letra (A) maiuscula
$var = str_replace ("À","a",$var);
$var = str_replace ("Ã","a",$var);
$var = str_replace ("Â","a",$var);
$var = str_replace ("Ã","a",$var);

// Letra (E) menuscula
$var = str_replace ("é","e",$var);
$var = str_replace ("è","e",$var);
$var = str_replace ("ê","e",$var);

// Letra (E) maiuscula
$var = str_replace ("É","E",$var);
$var = str_replace ("È","E",$var);
$var = str_replace ("Ê","E",$var);

// Letra (O) menuscula
$var = str_replace ("ó","o",$var);
$var = str_replace ("ò","o",$var);
$var = str_replace ("ô","o",$var);
$var = str_replace ("õ","o",$var);
$var = str_replace ("º","o",$var);

// Letra (O) maiuscula
$var = str_replace ("Ó","O",$var);
$var = str_replace ("Ã’","O",$var);
$var = str_replace ("Ô","O",$var);
$var = str_replace ("Õ","O",$var);

// Letra (U) menuscula
$var = str_replace ("ú","u",$var);
$var = str_replace ("ù","u",$var);
$var = str_replace ("û","u",$var);


// Letra (U) maiuscula
$var = str_replace ("Ú","U",$var);
$var = str_replace ("Ù","U",$var);
$var = str_replace ("Û","U",$var);

// Letra (Cedilha) menuscula
$var = str_replace ("ç","c",$var);


// Letra (Cedilha) maiuscula
$var = str_replace ("Ç","C",$var);

return $var;
}
?>

 

Ai substitui essas letras ai que estão em utf-8 pelos acentos!

 

ou

 

<?php

function trataTxt($var) {

$var = strtolower($var);

$var = ereg_replace("[áàâãª]","a",$var);	
$var = ereg_replace("[éèê]","e",$var);	
$var = ereg_replace("[óòôõº]","o",$var);	
$var = ereg_replace("[úùû]","u",$var);	
$var = str_replace("ç","c",$var);

return $var;
}

echo "Texto com acento:" . "á é í ó ú";
echo "<br>";
echo "Texto sem acento:" . trataTxt("á é í ó ú");

?>

 

Agora se não funfar por ser envio de E-mail e o texto for dinâmico, cadastre o texto com <meta> iso na sua página! isso resolve pra mim!!!

 

Espero ter ajudado :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então... cara estou enloucando.

Tipo... consigo usar o str_replace() de todas aquelas formas executando algo do tipo

 

function chars_to_ent($str) {

  $html_ent = array("Á", "á");
  $chars = array("Á", "á");
  return str_replace($chars, $html_ent, $str);
}

$texto = "Á á";

echo chars_to_ent($texto); 

 

mas quando uso para converter na forma de uma variável que será enviada ao DB, como abaixo:

 

function chars_to_ent($str) {

  $html_ent = array("Á", "á");
  $chars = array("Á", "á");
  return str_replace($chars, $html_ent, $str);
}

$texto = chars_to_ent($_POST['texto']);
$valor = str_replace(',', '.', $_POST['valor']);

$q = "UPDATE $tbl SET $tbl.TEXTO='$texto', tbl.VALOR='$valor' WHERE $tbl.ID='1'";
mysql_query($q);

 

simplesmente não realiza a conversão. Engraçado que se vocês perceberem, eu uso o str_replace dessa forma para trocar a , pelo . e funciona corretamente.

 

Uma coisa importante é que a declação da função ocorre no início do código, e a requisição do $_POST ocorre dentro de um for() que por sua vez está dentro de um if(). Haveria alguma relação?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando você pede pra monstrar Á automaticamente o navegador ou BD interpréta o carctere acentuado Á. Você tem que utilizar função htmlspecialchars() pra o sistema gravar o código e não o caracter.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você for usar alguma dessas funções, pode descartar qualquer outra formatação para a variável e usar ela somente na hora de mandar pro SQL...

 

$string_to_form_[$i] = htmlspecialchars($_POST['descricao-'.$i]);

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.