Ir para conteúdo

POWERED BY:

Arquivado

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

PauloRJ

[Resolvido] preg_replace

Recommended Posts

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

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

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

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

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

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

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

×

Informação importante

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