Ir para conteúdo

Arquivado

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

Yuri Fontella

Remover acentos em strings php

Recommended Posts

Eu geralmente uso esta função:

 

function remover_caracter($string) {
    $string = preg_replace("/[áàâãä]/", "a", $string);
    $string = preg_replace("/[ÁÀÂÃÄ]/", "A", $string);
    $string = preg_replace("/[éèê]/", "e", $string);
    $string = preg_replace("/[ÉÈÊ]/", "E", $string);
    $string = preg_replace("/[íì]/", "i", $string);
    $string = preg_replace("/[ÍÌ]/", "I", $string);
    $string = preg_replace("/[óòôõö]/", "o", $string);
    $string = preg_replace("/[ÓÒÔÕÖ]/", "O", $string);
    $string = preg_replace("/[úùü]/", "u", $string);
    $string = preg_replace("/[ÚÙÜ]/", "U", $string);
    $string = preg_replace("/ç/", "c", $string);
    $string = preg_replace("/Ç/", "C", $string);
    $string = preg_replace("/[][><}{)(:;,!?*%~^`@]/", "", $string);
    $string = preg_replace("/ /", "_", $string);
    return $string;
}
// Para usar
echo remover_caracter("Não vai os espaços nem acentuação");

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma forma mais simples.

<?php 

$string = 'ÁÍÓÚÉÄÏÖÜËÀÌÒÙÈÃÕÂÎÔÛÊáíóúéäïöüëàìòùèãõâîôûêÇç';

echo preg_replace( '/[`^~\'"]/', null, iconv( 'UTF-8', 'ASCII//TRANSLIT', $string ) );

 


Saída

AIOUEAIOUEAIOUEAOAIOUEaioueaioueaioueaoaioueCc

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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");

Compartilhar este post


Link para o post
Compartilhar em outros sites

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:

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites


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));

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Uma forma mais simples.

 

<?php 

$string = 'ÁÍÓÚÉÄÏÖÜËÀÌÒÙÈÃÕÂÎÔÛÊáíóúéäïöüëàìòùèãõâîôûêÇç';

echo preg_replace( '/[`^~\'"]/', null, iconv( 'UTF-8', 'ASCII//TRANSLIT', $string ) );

Saída

AIOUEAIOUEAIOUEAOAIOUEaioueaioueaioueaoaioueCc

ficou cheio de ?????????????????????????????????????? no meu

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.