Ir para conteúdo

POWERED BY:

Arquivado

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

João C. Neto

Como poderia fazer ?

Recommended Posts

Boa tarde Grandes!

Preciso da Grande ajuda de vocês!

 

Usando:

- PHP

- Mysql

 

Estou mexendo em um banco de dados de um amigo o qual teve alguns dados inseridos errados ou meio confusos ou sou eu que estou dificultando.

 

Ex: Mariana "Gurizinha's"

 

Esse exemplo foi salvo no banco da seguinte maneira: \'Gurizinha\'s\'

 

Para exibir no website dele eu tentei criar uma função a qual substitui o caractere inicial por um " e o final também por ".

 

O Certo seria pegar um texto que foi salvo dessa forma e que possui 100 palavras ou mais e corrigir exibindo: "Gurizinha's" ao invés de \'Gurizinha\'s\'.

Ai minha cabeça deu um nó pois se eu usar str_replace ele vai pegar todo o texto e o que tiver \' vai mudar para " então se for palavras que precisem Are's ele vai substituir por ".

 

 

 

 

 

function rt_especial($valor){
$i = 0;

$palavras = explode(' ', $valor);

foreach($palavras as $Arr) {
$i++;
$novotexto = stripcslashes($Arr);
$i2 = 0;
$palavras2 = explode("'", $novotexto);
foreach($palavras2 as $Arr2) {
$i2++;
}
for($i3 =0; $i3 <= $i2; $i3++){

$str = '"';
$str .= $palavras2[$i3];

}

}

echo substr($string, -1);

$novotexto = join(' ', $novotexto);

return $novotexto;
}

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não poderia converter diretamente no banco de dados ?

 

A lógica é:

Onde houver \' precedido ou sucedido por caracteres não alfanuméricos, mande substituir.

 

Para isso, pode aplicar regex com replace no próprio SQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiramente, muito obrigado.

Tentei em sem SQL para MySQL e não obtive sucesso pelo fato de ser texto que está variando muito na quantidade de caracteres e esses especiais uma hora vem no inicio outra no meio outra no fim e no meio.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em PHP poderia ser feito assim:

     $str = "\Gurizinha\'s\'";
     $str =  str_replace(' ', "'", trim(preg_replace("/([\\\]|[\\\'])+/", " ", $str))); 
     echo $str = '"' . $str . '"';

É só um exemplo, nem de longe isto ficou elegante, mas é um começo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

#3 por isso indiquei o uso do regex.. pois não há um padrao fixo em relação ao tamanho das strings e tb não há um ponto unico.

 

pode fazer tanto no php quanto no sql ... se o intuito é corrigir o que está no banco, obviamente procure resolver no proprio sql..

 

 

#4 isso não ajuda.. pois não é o que ele pede..

Compartilhar este post


Link para o post
Compartilhar em outros sites
Com SQL acredito que isto possa ser resolvido:


UPDATE sua_tabela

SET sua_coluna = REPLACE(sua_coluna, "\\'", '"')

WHERE sua_coluna LIKE "%\'%"



Se tiver mais de uma coluna aconselho fazer stored procedure

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em PHP poderia ser feito assim:

     $str = "\Gurizinha\'s\'";
     $str =  str_replace(' ', "'", trim(preg_replace("/([\\\]|[\\\'])+/", " ", $str))); 
     echo $str = '"' . $str . '"';

É só um exemplo, nem de longe isto ficou elegante, mas é um começo.

 

 

SQL

SELECT 
REPLACE(TRIM(regex_replace( '([\\\]|[\\\'])+', '  ', nome_coluna )), '   ', '\'') AS teste 
FROM nome_tabela;



Como o MySQL não possui de forma nativa uma função de replace com suporte a expressões regulares, terá que criar uma function que de este suporte:

 

DELIMITER $$
CREATE FUNCTION  `regex_replace`(pattern VARCHAR(1000),replacement VARCHAR(1000),original VARCHAR(1000))

RETURNS VARCHAR(1000)
DETERMINISTIC
BEGIN 
 DECLARE temp VARCHAR(1000); 
 DECLARE ch VARCHAR(1); 
 DECLARE i INT;
 SET i = 1;
 SET temp = '';
 IF original REGEXP pattern THEN 
  loop_label: LOOP 
   IF i>CHAR_LENGTH(original) THEN
    LEAVE loop_label;  
   END IF;
   SET ch = SUBSTRING(original,i,1);
   IF NOT ch REGEXP pattern THEN
    SET temp = CONCAT(temp,ch);
   ELSE
    SET temp = CONCAT(temp,replacement);
   END IF;
   SET i=i+1;
  END LOOP;
 ELSE
  SET temp = original;
 END IF;
 RETURN temp;
END$$
DELIMITER ;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado a todos.

Eu criei uma função a qual não é das mais bonitas muito menos a mais correta porem foi a unica maneira encontrada.

 

function rt_especial($valor){

        $string = $valor;
        $separa = explode(" ", $string); // quebra a string nos espaços
        $count = count($separa); // quantidade de separações

        $arrayok = array();



        for($i=0; $i<= $count; $i++)
        {
            // Pego toda palavra que começa com \' e substituo por "
            $string2 = ereg_replace("^([/\'])", '"',$separa[$i]);
            $string3 = str_replace("\',", '",', $string2);
            $string4 = str_replace("\',", '",', $string3);

            $string5 = ereg_replace('^([/""])', '"',$string4);
            $string6 = ereg_replace('([/""])$', '"',$string5);

            //Pego toda palavra que termina com \' e substituo por "
            $string = ereg_replace("([/\'])$", '"',$string6);
            $string7 = str_replace('"\'', '"', $string);
            $string8 = str_replace("\'\"", '"', $string7);
            $string9 = str_replace('\"', '"', $string8);


            $arrayok[$i] = $string9;

        }

        $ccp = implode(' ', $arrayok);

        return $ccp;
    }

Compartilhar este post


Link para o post
Compartilhar em outros sites
Não entendi, pq isto n lhe atende:



<?php

$a = "\'404\' iv'anif \'barichini\' kov" ;

$words = explode(' ' , $a );

var_dump($words);

$doido = preg_replace("/\\\'/" , "'" , $words);

var_dump($doido);

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

paciência... vamos lá...

 

 

 

#11, #13

 

a situação é o que está descrito no #7... exatamente o que resumi no #2..

 

o problema, para deixar mais claro, segundo o que interpretei é,

 

houve um erro em gravar os dados com single quotes, no qual foi escapado single quotes onde não deveria e assim foi gravado no banco..

 

o que ele quer é corrigir, porém não pode aplicar de uma forma geral pois removerá single quotes válidas.

por isso, não é apenas remover os escapes... é remover ou substituir as single quotes em locais errados..

 

 

para isso, precisa criar um regex conforme explicado no #2...

 

outra forma é ir fazendo com explode, strpos e coisas do tipo... o script ficará bem nesse estilo do #12.. ou #13 ou seja, uma gambiarra... pois os dados continuarão "corrompidos no banco" a menos que faça a doidera de ler todos os registros no php e gravá-los novamente... inviável.. porém também resolve..

 

todavia, é mais fácil aplicar uma function no sql...

 

entendido agora garotada ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

paciência... vamos lá...

 

 

 

#11, #13

 

a situação é o que está descrito no #7... exatamente o que resumi no #2..

 

o problema, para deixar mais claro, segundo o que interpretei é,

 

houve um erro em gravar os dados com single quotes, no qual foi escapado single quotes onde não deveria e assim foi gravado no banco..

 

o que ele quer é corrigir, porém não pode aplicar de uma forma geral pois removerá single quotes válidas.

por isso, não é apenas remover os escapes... é remover ou substituir as single quotes em locais errados..

 

 

para isso, precisa criar um regex conforme explicado no #2...

 

outra forma é ir fazendo com explode, strpos e coisas do tipo... o script ficará bem nesse estilo do #12.. ou #13 ou seja, uma gambiarra... pois os dados continuarão "corrompidos no banco" a menos que faça a doidera de ler todos os registros no php e gravá-los novamente... inviável.. porém também resolve..

 

todavia, é mais fácil aplicar uma function no sql...

 

entendido agora garotada ?

 

Isso mesmo amigo.

Obrigado pela explicação.

 

Não fui muito claro.

 

Creio que essa minha função funcionando poso pegar a impressão dela e colocar no banco.

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.