Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde... Como faço para remover acentos de uma string?
Uma forma mais simples.
<?php
$string = 'ÁÍÓÚÉÄÏÖÜËÀÌÒÙÈÃÕÂÎÔÛÊáíóúéäïöüëàìòùèãõâîôûêÇç';
echo preg_replace( '/[`^~\'"]/', null, iconv( 'UTF-8', 'ASCII//TRANSLIT', $string ) );
Saída
AIOUEAIOUEAIOUEAOAIOUEaioueaioueaioueaoaioueCc
Obrigado allex_carvalho... Melhor ainda Carlos Coelho, funcionou ;)
Obrigado por compartilhar conosco Carlos Coelho, muito simples e funcional. Abusando da sua boa vontade, dentro desse exemplo que você nos apresentou, é possível que se faça de tal forma em os os espaços sejam substituídos por "_"? Retirá-los é bem fácil, basta acrescentar um espaço dentro da expressão, agora quanto a substituição é que fiquei em dúvidas de como fazer. Abraços!
Bom, já que o tópico foi ressuscitado, vou deixar minha contribuição que dispensa o uso de iconv() que as vezes não está disponível em servidores compartilhados geridos por chimpanzés raivosos (que compilam o PHP sem ela):
<?php
$string = 'ÁÍÓÚÉÄÏÖÜËÀÌÒÙÈÃÕÂÎÔÛÊáíóúéäïöüëàìòùèãõâîôûêÇç';
$tr = strtr(
$string,
array (
'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A',
'Æ' => 'A', 'Ç' => 'C', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E',
'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ð' => 'D', 'Ñ' => 'N',
'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O',
'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', 'Ŕ' => 'R',
'Þ' => 's', 'ß' => 'B', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a',
'ä' => 'a', 'å' => 'a', 'æ' => 'a', 'ç' => 'c', 'è' => 'e', 'é' => 'e',
'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i',
'ð' => 'o', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o',
'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ý' => 'y',
'þ' => 'b', 'ÿ' => 'y', 'ŕ' => 'r'
)
);
var_dump( $tr ); //string(47) "AIOUEAIOUEAIOUEAOAIOUEaioueaioüeaioueaoaioueCc"
Quanto à pergunta acima, tanto quanto eu sei, com a iconv() você não faz isso pois ela trata codificações de caracteres e não os caracteres em si.
Mas nada que um str_replace() DEPOIS do preg_match() do Carlos não resolva. Obviamente que ao invés de ecoar diretamente o resultado este deve ser armazenado numa variável a fim de str_replace() ter sobre o que operar.
Utilizando strtr() como eu fiz, basta que você adicione uma nova entrada em qualquer ponto do array e usufruir de uma, na minha opinião, falha de conceito de arrays que o PHP tem (índices vazios).
Ambas as técnicas tem prós e contras. A do Carlos é a "limitação" de matar dois Coelho ( :lol: ) uma cajadada só pois cada funcionalidade deve ser usada para um fim específico e este não é o propósito da iconv() e ainda arriscar um servidor chinfrim que não a tenha disponível.
Já strstr() é ligeiramente mais rápida que preg_match() e ainda permite você fazer essa gambiarrazinha, mas você fica a mercê desse "bug" ser corrigido e vocêr ter de mexer no código às pressas. Isso sem contar que os caracteres dessa lista podem nem ser todos os acentuados ou problemáticos existentes. Essa lista abrange vários deles, mas sempre tem mais um...
Muito bom, Alex... mas como eu faço para que todos os caracteres fiquem em minusculo? Obrigado
Muito bom, Alex... mas como eu faço para que todos os caracteres fiquem em minusculo? Obrigado
Tente assim IRL master...
function remover_caracter($string) {
$string = preg_replace("/[ÁÀÂÃÄáàâãä]/", "a", $string);
$string = preg_replace("/[ÉÈÊéèê]/", "e", $string);
$string = preg_replace("/[ÍÌíì]/", "i", $string);
$string = preg_replace("/[ÓÒÔÕÖóòôõö]/", "o", $string);
$string = preg_replace("/[ÚÙÜúùü]/", "u", $string);
$string = preg_replace("/Çç/", "c", $string);
$string = preg_replace("/[][><}{)(:;,!?*%~^`@]/", "", $string);
$string = preg_replace("/ /", "_", $string);
$string = strtolower($string);
return $string;
}
// Para usar
echo remover_caracter("NÃO VÃO APARECER CARACTERES ESPECIAIS, ESPAÇOS OU LETRAS MAIÚSCULAS");Usar N preg_replace() pra isso (já que essas não são todas as situações) é matar formiga com bola de canhão.
Só dizendo... :closedeyes:
>
Tente assim IRL master...
function remover_caracter($string) {
$string = preg_replace("/[ÁÀÂÃÄáàâãä]/", "a", $string);
$string = preg_replace("/[ÉÈÊéèê]/", "e", $string);
$string = preg_replace("/[ÍÌíì]/", "i", $string);
$string = preg_replace("/[ÓÒÔÕÖóòôõö]/", "o", $string);
$string = preg_replace("/[ÚÙÜúùü]/", "u", $string);
$string = preg_replace("/Çç/", "c", $string);
$string = preg_replace("/[][><}{)(:;,!?*%~^`@]/", "", $string);
$string = preg_replace("/ /", "_", $string);
$string = strtolower($string);
return $string;
}
// Para usar
echo remover_caracter("NÃO VÃO APARECER CARACTERES ESPECIAIS, ESPAÇOS OU LETRAS MAIÚSCULAS");
Obrigado Rhuan Pablo, deu certo. Forte abraço!
Usando tanto a minha solução quanto do Bruno Augusto, vc terá apenas que utilizar um strtolower no retorno da função.
A solução do Rhuan Pablo é gambiarra.
Uso esta função tem, Funcionando muito bem.
Chamar função no seu link:
<a href="<? echo "$dados5[id]";?>/-<?php $url = "($dados5[nome])"; utf8_decode($url); echo removeAcentos($url, '-'); ?>.html">
/***
* Função para remover acentos de uma string
*
* @autor Thiago Belem <contato@thiagobelem.net>
*/
function removeAcentos($string, $slug = false) {
$string = strtolower($string);
// Código ASCII das vogais
$ascii['a'] = range(224, 230);
$ascii['e'] = range(232, 235);
$ascii['i'] = range(236, 239);
$ascii['o'] = array_merge(range(242, 246), array(240, 248));
$ascii['u'] = range(249, 252);
// Código ASCII dos outros caracteres
$ascii['b'] = array(223);
$ascii['c'] = array(231);
$ascii['d'] = array(208);
$ascii['n'] = array(241);
$ascii['y'] = array(253, 255);
foreach ($ascii as $key=>$item) {
$acentos = '';
foreach ($item AS $codigo) $acentos .= chr($codigo);
$troca[$key] = '/['.$acentos.']/i';
}
$string = preg_replace(array_values($troca), array_keys($troca), $string);
// Slug?
if ($slug) {
// Troca tudo que não for letra ou número por um caractere ($slug)
$string = preg_replace('/[^a-z0-9]/i', $slug, $string);
// Tira os caracteres ($slug) repetidos
$string = preg_replace('/' . $slug . '{2,}/i', $slug, $string);
$string = trim($string, $slug);
}
return $string;
}Empacotar numa função parametrizável com esse recurso slugficador ( :sick:) até que é interessante, mas a abordagem da substituição de caracteres com arrays é tão... esdrúxula, que quase chega a ser uma piada.
O que faço, meu retorno traz apenas o primeiro caracter, ao invés da palavra toda.
Música, ele retorna apenas a letra "M"
Coloque o seu código Thiago Ladislau...
function retiraAcentos($texto){
$de = array('Á','Í','Ó','Ú','É','Ä','Ï','Ö','Ü','Ë','À','Ì','Ò','Ù','È','Ã','Õ','Â','Î','Ô','Û','Ê','á','í','ó','ú','é','ä','ï','ö','ü','ë','à','ì','ò','ù','è','ã','õ','â','î','ô','û','ê','Ç','ç',' ');
$para = array('A','I','O','U','E','A','I','O','U','E','A','I','O','U','E','A','O','A','I','O','U','E','a','i','o','u','e','a','i','o','u','e','a','i','o','u','e','a','o','a','i','o','u','e','C','c','-');
return preg_replace("/[^a-zA-Z0-9_-]/", "", str_replace($de,$para,$texto));
}>
Uma forma mais simples.
<?php
$string = 'ÁÍÓÚÉÄÏÖÜËÀÌÒÙÈÃÕÂÎÔÛÊáíóúéäïöüëàìòùèãõâîôûêÇç';
echo preg_replace( '/[`^~\'"]/', null, iconv( 'UTF-8', 'ASCII//TRANSLIT', $string ) );
Saída
AIOUEAIOUEAIOUEAOAIOUEaioueaioueaioueaoaioueCc
ficou cheio de ?????????????????????????????????????? no meu
Eu geralmente uso esta função:
// Para usar echo remover_caracter("Não vai os espaços nem acentuação");