PauloRJ 4 Denunciar post Postado Julho 27, 2009 Estou com essa função de limpar texto mas nao funciona corretamente. a função remove os caracteres mas nao substitui. Texto: palhaço açucar não foi *hun < > | Jesus Amém Resultado: palhao-aucar-no-foi-hun-esus-mm e nao estou conseguindo desvendar isso nao! function geraUrlLimpa($texto) { /* função que gera uma texto limpo pra virar URL: - limpa acentos e transforma em letra normal - limpa cedilha e transforma em c normal, o mesmo com o ñ - transforma espaços em hifen (-) - tira caracteres invalidos by Micox - elmicox.blogspot.com - www.ievolutionweb.com */ //desconvertendo do padrão entitie (tipo á para á) $texto = html_entity_decode($texto); $replaces = array( '/[áàãâä]/u' => 'a', '/[éèêë]/u' => 'e', '/[íìîï]/u' => 'i', '/[óòõôö]/u' => 'o', '/[úùûü]/u' => 'u', '/[ç]/u' => 'c', '/[ñ]/u' => 'n', '/( )/' => '-', '/[^a-z0-9\-_]/' => '', //tirando outros caracteres invalidos //'/--/' => '-' //trocando duplo espaço (hifen) por 1 hifen só '/-+/' => '-', // substitui múltiplos espaços (hifens) por apenas um '/_/' => '-' ); $texto = preg_replace(array_keys($replaces), array_values($replaces), $texto); return strtolower($texto); } Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2009 Estou com essa função de limpar texto mas nao funciona corretamente. a função remove os caracteres mas nao substitui. Texto: palhaço açucar não foi *hun < > | Jesus Amém Resultado: palhao-aucar-no-foi-hun-esus-mm Bom amigão, o que acontece é que quando usamos UTF-8 são usados dois caracteres para identificar uma única letra, por exemplo: Ç => <U00C7> => 0xc3 + 0x87 ç => <U00E7> => 0xc3 + 0xa7 Essa forma de escrever uma única letra muito provavelmente está confundindo sua função, tenta assim: function troca( $mtc ){ $ret = $mtc[ 0 ]; switch ( $ret ){ case "ã": case "á": case "à": case "â": case "ä": $ret = "a"; break; case "é": case "è": case "ê": case "ë": $ret = "e"; break; case "í": case "ì": case "î": case "ï": $ret = "i"; break; case "õ": case "ó": case "ò": case "ô": case "ö": $ret = "o"; break; case "ú": case "ù": case "û": case "ü": $ret = "u"; break; case "ç": $ret = "c"; break; } return( $ret ); } $str = "Dúvida com substituição de caracteres"; $str = preg_replace_callback( "/[^\\w]{2}/" , "troca" , $str ); //Aqui pegamos qualquer coisa que não for um identificador e que ocorra 2 vezes $str = preg_replace( "/\\s+/" , "-" , $str ); $str = preg_replace( "/_/" , "-" , $str ); printf( "%s\n" , $str ); A saída será: Duvida-com-substituicao-de-caracteres[/code] Compartilhar este post Link para o post Compartilhar em outros sites
PauloRJ 4 Denunciar post Postado Julho 27, 2009 A saida nao esta funcionando nao. Tive como retorno: "D" nada mais. alguma solução? Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 28, 2009 A saida nao esta funcionando nao. Tive como retorno: "D" nada mais. Qual a versão da sua PCRE ? Compartilhar este post Link para o post Compartilhar em outros sites
Leandro de Jesus 5 Denunciar post Postado Julho 28, 2009 Eu uso para esse e funciona tranquilo function nome_html($str, $enc = 'UTF-8'){ $acentos = array( 'A' => '/À|Á|Â|Ã|Ä|Å/', 'a' => '/à|á|â|ã|ä|å/', 'C' => '/Ç/', 'c' => '/ç/', 'E' => '/È|É|Ê|Ë/', 'e' => '/è|é|ê|ë/', 'I' => '/Ì|Í|Î|Ï/', 'i' => '/ì|í|î|ï/', 'N' => '/Ñ/', 'n' => '/ñ/', 'O' => '/Ò|Ó|Ô|Õ|Ö/', 'o' => '/ò|ó|ô|õ|ö/', 'U' => '/Ù|Ú|Û|Ü/', 'u' => '/ù|ú|û|ü/', 'Y' => '/Ý/', 'y' => '/ý|ÿ/', 'a.' => '/ª/', 'o.' => '/º/' ); $final = preg_replace($acentos, array_keys($acentos), htmlentities($str,ENT_NOQUOTES, $enc)); $texto = str_replace(" ","_",$final); return strtolower($texto).".html"; } Chamo assim nome_html($row['titulo']) Compartilhar este post Link para o post Compartilhar em outros sites
PauloRJ 4 Denunciar post Postado Julho 28, 2009 incrivel mas não funciona corretamente: retorno: palhaço_açucar_não_foihun__jesus_amém.html Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 28, 2009 retorno: palhaço_açucar_não_foihun__jesus_amém.html Bom, segunda tentativa: function troca( $str , $utf8_encode = false ){ $str = preg_replace( array( "/xc3[x80-x85]/", "/xc3x87/", "/xc3[x88-x8b]/", "/xc3[x8c-x8f]/", "/xc3([x92-x96]|x98)/", "/xc3[x99-x9d]/", "/xc3[xa0-xa5]/", "/xc3xa7/", "/xc3[xa8-xab]/", "/xc3[xac-xaf]/", "/xc3([xb2-xb6]|xb8)/", "/xc3[xb9-xbc]/", "/(\s+|[^A-Za-z0-9_]+)/", "/_+/" ) , str_split( "ACEIOUaceiou__" ) , $utf8_encode ? utf8_encode( $str ) : $str ); return( $str ); } Usando a sua string: $str = "palhaço açucar não foi *hun < > | Jesus Amém"; printf( "%sn" , troca( $str ) ); a saída foi: palhaco_acucar_nao_foi_hun_Jesus_Amem Se não funcionar então você deve tentar utilizar o segundo parâmetro da função troca: $str = "palhaço açucar não foi *hun < > | Jesus Amém"; printf( "%sn" , troca( $str , true ) ); Compartilhar este post Link para o post Compartilhar em outros sites
PauloRJ 4 Denunciar post Postado Julho 29, 2009 Fui pesquisar sobre str_split e vi que funciona no php5 na outra maquina estava com o 4. Agora tudo com php 5 o retorno foi o seguinte: Saida: palha_o_a_ucar_n_o_foi_hun_Jesus_Am_mn Ele esta removendo os caracteres e nao substituindo/troca como necessario. tentando aqui tb. mas ta complicado abc Compartilhar este post Link para o post Compartilhar em outros sites
PauloRJ 4 Denunciar post Postado Julho 30, 2009 Bom, resolvi meu problema da seguinte forma. function limpatexto($str) { // Substituir acentos da string $from = @base64_decode("wMHDwsnKzdPV1Nrcx+Dh4+Lp6u3z9fT6/Oc="); $to = @base64_decode("QUFBQUVFSU9PT1VVQ2FhYWFlZWlvb291dWM="); $final = strtr($str, $from, $to); // Substituir caracteres $final = str_replace(" ","_" ,$final); $final = str_replace(" ","_" ,$final); $final = str_replace("*","" ,$final); $final = str_replace("|","" ,$final); $final = str_replace("/","" ,$final); $final = str_replace("<","" ,$final); $final = str_replace(">","" ,$final); $final = str_replace("?","" ,$final); $final = str_replace("!","" ,$final); $final = str_replace("'","" ,$final); $final = str_replace(":","" ,$final); $final = str_replace("___","_" ,$final); $final = str_replace("__","_" ,$final); return $final; } $textow = "palhaço açucar não foi *hun < > | Jesus Amém"; echo limpatexto($textow); retorno: palhaco_acucar_nao_foi_hun_Jesus_Amem abraço! Compartilhar este post Link para o post Compartilhar em outros sites