Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
criei uma função para substituir os caracteres com acento enviados a uma tabela.
eu tenho um formulario de cadastro de um conteudo, e com o titulo, eu crio uma variavel $url, aplico a função para tirar todos acentos, sinais e espaços e transformo na url enviada ao banco..
função:
function acentos_url ($url)
{
$url = str_replace(' ','-',$url);
$url = str_replace('+','',$url);
$url = str_replace('#','',$url);
$url = str_replace('@','',$url);
$url = str_replace('%','',$url);
$url = str_replace('!','',$url);
$url = str_replace('?','',$url);
$url = str_replace('*','',$url);
$url = str_replace('&','',$url);
$url = str_replace('+','',$url);
$url = str_replace('[','',$url);
$url = str_replace(']','',$url);
$url = str_replace('.','',$url);
$url = str_replace(',','',$url);
$url = str_replace('á','a',$url);
$url = str_replace('à','a',$url);
$url = str_replace('ã','a',$url);
$url = str_replace('â','a',$url);
$url = str_replace('ä','a',$url);
$url = str_replace('Á','a',$url);
$url = str_replace('À','a',$url);
$url = str_replace('Ã','a',$url);
$url = str_replace('Â','a',$url);
$url = str_replace('Ä','a',$url);
$url = str_replace('é','e',$url);
$url = str_replace('è','e',$url);
$url = str_replace('ê','e',$url);
$url = str_replace('ë','e',$url);
$url = str_replace('É','e',$url);
$url = str_replace('È','e',$url);
$url = str_replace('Ê','e',$url);
$url = str_replace('Ë','e',$url);
$url = str_replace('í','i',$url);
$url = str_replace('ì','i',$url);
$url = str_replace('î','i',$url);
$url = str_replace('Í','i',$url);
$url = str_replace('ó','o',$url);
$url = str_replace('Ó','o',$url);
$url = str_replace('ú','u',$url);
$url = str_replace('ù','u',$url);
$url = str_replace('û','u',$url);
$url = str_replace('ü','u',$url);
$url = str_replace('Ú','u',$url);
$url = str_replace('Ù','u',$url);
$url = str_replace('Û','u',$url);
$url = str_replace('Ü','u',$url);
$url = str_replace('Ç','c',$url);
$url = str_replace('ç','c',$url);
$url = str_replace('á','a',$url);
$url = str_replace('à','a',$url);
$url = str_replace('ã','a',$url);
$url = str_replace('â','a',$url);
$url = str_replace('ä','a',$url);
$url = str_replace('Á','a',$url);
$url = str_replace('À','a',$url);
$url = str_replace('Ã','a',$url);
$url = str_replace('Â','a',$url);
$url = str_replace('Ä','a',$url);
$url = str_replace('é','e',$url);
$url = str_replace('è','e',$url);
$url = str_replace('ê','e',$url);
$url = str_replace('ë','e',$url);
$url = str_replace('É','e',$url);
$url = str_replace('È','e',$url);
$url = str_replace('Ê','e',$url);
$url = str_replace('Ë','e',$url);
$url = str_replace('í','i',$url);
$url = str_replace('ì','i',$url);
$url = str_replace('î','i',$url);
$url = str_replace('Í','i',$url);
$url = str_replace('Î','i',$url);
$url = str_replace('Ì','i',$url);
$url = str_replace('Ï','i',$url);
$url = str_replace('Ó','o',$url);
$url = str_replace('Ô','o',$url);
$url = str_replace('Ò','o',$url);
$url = str_replace('Õ','o',$url);
$url = str_replace('Ö','o',$url);
$url = str_replace('ó','o',$url);
$url = str_replace('ô','o',$url);
$url = str_replace('ò','o',$url);
$url = str_replace('õ','o',$url);
$url = str_replace('ö','o',$url);
$url = str_replace('ú','u',$url);
$url = str_replace('û','u',$url);
$url = str_replace('ù','u',$url);
$url = str_replace('ũ','u',$url);
$url = str_replace('ü','u',$url);
$url = str_replace('Ú','u',$url);
$url = str_replace('Û','u',$url);
$url = str_replace('Ù','u',$url);
$url = str_replace('Ũ','u',$url);
$url = str_replace('Ü','u',$url);
$url = strtolower($url);
$url = mysql_real_escape_string($url);
$url = trim($url);//limpa espaços vazio
$url = strip_tags($url);//tira tags html e php
return $url;
teste de titulo para se transformar em url:
áéíóú... âûêîô... çÇùà Teste A BIUWQE WQ
o que é gravado no banco:
áéíóú-âûêîô-çÇùà-teste-a-biuwqe-wq
os acentos permanecem pq????
devo fazer com ereg_replace?
Primeiramente eu gostaria de fazer uma crítica, como sempre construtiva para melhorar o seu código. Analisemos:
function acentos_url($url, $slug = false)
{
$url = str_replace("Ç","c",$url); //execução de str_replace: 1
$url = str_replace('Ç','c',$url); //execução de str_replace: 2
$url = str_replace("ç'","c",$url); //execução de str_replace: 3
$url = str_replace("ç",'c',$url); //execução de str_replace: 4
$url = str_replace(' ','-',$url); //execução de str_replace: 5
$url = str_replace('+','',$url); //execução de str_replace: 6
.
.
.
$url = str_replace('+','',$url); //execução de str_replace: n
Ou seja, você efetua VÁRIAS chamadas para uma mesma função, que aceita argumentos em forma de array. Ou seja, ao invéz de fazer várias chamadas, você pode criar dois arrays, um array de search e um de replace para passar à função. Basta sincronizar os indíces, para que o indíce n do array search (search[n]) seja substituído pelo valor armazenado no array replace na mesma posição n (replace[n]).
Então seu novo código ficaria assim:
function acentos_url($url, $slug = false)
{
$search = array('Ç','Ç'); //complete com os caracteres.
$replace = array('c','c'); //complete com os caracteres.
$url = str_replace($search,$replace,$url);
//continua com a função
A Luiz Cláudio, mas porque disso? Bom, não é novidade que uma chamada de função gera um processamento. Resta saber, esse processamento é mais vantajoso do que usar um recurso que a própria função oferece? Ou seja, é melhor chamar a função para substituir cada caractere? Ou passar um array de de caracteres a serem substituidos pela própria função?
Eu prefiro acreditar que os desenvolvedores do php estão cientes disso e por isso oferecem o recurso.
Outro ponto a se destacar é: você está tentando substituir caracteres como Ç por c. Mas espere! Você já está fazendo a substituição de Ç por c! Então vamos transformar todos os Ç (e semalhantes) em seus respectivos caracteres, e para isso, faremos assim:
$url = html_entity_decode($url);
Isso já vai praticamente dividir por 2 o tamanho dos nossos arrays de substituição!
Então nossa função ficará como (serei bonzinho e já postarei completinho):
function acentos_url($url)
{
$url = html_entity_decode($url); //elimina a necessida de trocar entitdades. ex: Ç por c ;)
$url = str_replace(array('+','#','@','%','!','?','*','&',']','[','.',','),'',$url);
$url = str_replace(array('á','à','ã','â','ä','Á','À','Ã','Â','Ä'),'a',$url);
$url = str_replace(array('é','è','ê','ë','É','È','Ê','Ë'),'e',$url);
$url = str_replace(array('í','ì','î','Í','Ì','Î'),'i',$url);
$url = str_replace(array('ó','ò','õ','ô','ö','Ó','Ò','Õ','Ô','Ö'),'o',$url);
$url = str_replace(array('ú','ù','û','ü','Ú','Ù','Û','Ü'),'u',$url);
$url = str_replace(array(' ','Ç','ç','Ñ','ñ'),array('-','c','c','n','n'),$url);
$url = strtolower($url);
//$url = mysql_real_escape_string($url);
$url = trim($url);//limpa espaços vazio
$url = strip_tags($url);//tira tags html e php
return $url;
}
Logo, o comando:
echo acentos_url("+áéíóú... âûêîô... çÇùà Teste A BIUWQE WQ ");
Nos retorna a seguinte string:
aeiou-aueio-ccua-teste-a-biuwqe-wq-
Luiz Claudio. Sou muito grato pela sua ajuda.
Com a função que me passou, a url nao retornou como voce citou, retornou da seguinte forma:
áéíóú-âûêîô-ççùà-teste-a-biuwqe-wq
O que pode ser?
#4 está fazendo algo errado ou algum outro erro ou algo com charset encode..
tem um post do jbn mostrando como remover caracteres especiais, acentos, etc:
basicamente siga o post #3, e se quer implementar algo a mais veja o post #6 nesse tópico:
http://forum.imasters.com.br/topic/397858-somente-letra-e-numero/page__view__findpost__p__1556222
>
#4 está fazendo algo errado ou algum outro erro ou algo com charset encode..
tem um post do jbn mostrando como remover caracteres especiais, acentos, etc, usando hexadecimal
basicamente siga o post #3, e se quer implementar algo a mais veja o post #6 nesse tópico:
http://forum.imasters.com.br/topic/397858-somente-letra-e-numero/page__view__findpost__p__1556222
não entendi no que esse post pode me ajudar.
utilizo meta charset iso-8859-1 normalmente, nao modifiquei mais nada.
a função postada pelo Luiz Cláudio simplesmente retornou aquele valor com os acentos.
já busquei no manual do php e ainda nao achei solução, parece estar tudo normal.
ninguém sabe oque poderia ser?
estou aplicando da seguinte forma:
e aí faço a inserção no banco.
Bom, só achei uma solução, quem quiser...
function acentos_url($url, $slug = false)
{
juntei o que eu tinha com mais um código que encontrei aí, e ta tudo certo.. apenas o Ç (maiusculo) que nao ta substituindo, deve ser o setlocate(), mas ninguem usa Ç em titulos, entao ta tranquilo.