mbraganca 0 Denunciar post Postado Maio 14, 2009 Pretendo um script que faça a substituição numa string ($texto) de várias palavras por outras usando um dicionario. O dicionario é uma tabela MySQL com os campos: nome e link. O campo "nome" são as palavras que fazem match com o $texto, e que são substuidas pelas palavras do campo "link". (ver o que se pretende abaixo) <?php include ("def.php"); mysql_connect($host,$username,$password); @mysql_select_db($database) or die( "Impossivel seleccionar a base de dados"); // Liga ao dicionario $query = "SELECT * FROM dicionario"; // A FRASE $texto = "O joão caiu e partiu a escapula e o umero"; $result = mysql_query($query) or die(mysql_error()); while($row = mysql_fetch_array($result)){ //Substitui as palavras da frase $texto pelas do dicionario que fazem match $nome, substitui-as por $link $string = preg_replace("/".$row['nome']."/",$row['link'],$texto); echo $string; // Ele gera 3 frases diferentes *(numero de matches no dicionario) mas só substitui apenas uma das palavras em cada frase. $nome = $row['nome']; $link = $row['link']; } $string = preg_replace("/".$nome."/",$link,$texto); // Assim gera apenas 1 frase com apenas uma substituicao de palavra em vez dos 3 mathces ?> frase $texto: O joão caiu e partiu a escapula e o umero tabela: dicionario campo nome: escapula, umero, joão campo link: ombro, braco, pedro no primeiro echo saiem 3 frases: O joão caiu e partiu a ombro e o umero O joão caiu e partiu a escapula e o braco O pedro caiu e partiu a escapula e o umero no segundo echo do codigo ele gera apenas: O pedro caiu e partiu a escapula e o umero Em vez 3 frases distintas com apenas uma substituicao ou de uma frase com apenas uma substituicao gostava que a string $texto fosse completamente substituido nas palavras encontradas no dicionario criando apenas uma frase com as 3 substituicoes: O pedro caiu e partiu o ombro e o braco Obrigado M. Compartilhar este post Link para o post Compartilhar em outros sites
eibon 2 Denunciar post Postado Maio 14, 2009 Editei o titulo do seu tópico para ficar em conformidade com as regras. --- Não entendi o que você quer,e qual seu problema em faze-lo. Explique-me melhor. Compartilhar este post Link para o post Compartilhar em outros sites
mbraganca 0 Denunciar post Postado Maio 14, 2009 Editei o titulo do seu tópico para ficar em conformidade com as regras. --- Não entendi o que você quer,e qual seu problema em faze-lo. Explique-me melhor. Já actualizei o post com uma melhor explicação. Gostava que me sugerisse uma solução M. Compartilhar este post Link para o post Compartilhar em outros sites
eibon 2 Denunciar post Postado Maio 14, 2009 Eis uma saída: tabela1 id | frase 0 | O José caiu e partiu $1 ---------------------------------------- tabela2 ref_id | dic 0 | o ombro 0 | a escapula 0 | o braço <?php //$id vem de algum lugar $queryFrase = 'SELECT * FROM tabela1 WHERE id = '.$id; //executa...fetch na variavel $frase $queryDic = 'SELECT * FROM tabela2 WHERE ref_id = '.$id; //executa...fecth no array $dicWords $dicWords = implode(' e ', $dicWords); preg_replace('/(\$[0-9]+)/', $dicWords, $frase); ?> AInda não entendi bem o que você quer. Compartilhar este post Link para o post Compartilhar em outros sites
mbraganca 0 Denunciar post Postado Maio 14, 2009 AInda não entendi bem o que você quer.DB: dicionarionome | link joao | pedro escapula | ombro umero | braço A ideia é tendo uma string "O joao caiu e partiu a escapula e o umero" fazer replace das 3 palavras encontradas num dicionario *(tabela), ficando com a seguinte frase: "O pedro caiu e partiu o ombro e o braco" Compartilhar este post Link para o post Compartilhar em outros sites
eibon 2 Denunciar post Postado Maio 14, 2009 <?php $query1 = 'SELECT frase from tabela1'; //executa...fetch na variavel $frase...etc $query = 'SELECT * FROM tabela2'; //executa...fetch no array $results (de indices) $size = count($results); for($i = 0;$i < $size;$i++){ str_ireplace($results[$i][0], $results[$i][1], $frase); } ?> Nesse caso expressões regulares são desnecessárias. Compartilhar este post Link para o post Compartilhar em outros sites
mbraganca 0 Denunciar post Postado Maio 14, 2009 <?php //executa...fetch no array $results (de indices) $size = count($results); for($i = 0;$i < $size;$i++){ str_ireplace($results[$i][0], $results[$i][1], $frase); } ?> Nesse caso expressões regulares são desnecessárias. O str_ireplace é função do php 5.x. Existirá outra forma? M. Compartilhar este post Link para o post Compartilhar em outros sites
eibon 2 Denunciar post Postado Maio 14, 2009 Várias outras maneiras. Inclusive com o str_replace,ou nosso velho e deprecated amigo ereg. Pode fazer manualmente também. Ps: é legal você atualizar seu PHP... Compartilhar este post Link para o post Compartilhar em outros sites
mbraganca 0 Denunciar post Postado Maio 14, 2009 Várias outras maneiras. Inclusive com o str_replace,ou nosso velho e deprecated amigo ereg. Pode fazer manualmente também. Ps: é legal você atualizar seu PHP... Obrigado pelas dicas. Sei dessas funções e tentei elas antes de usar o preg_replace, mas a realidade é que nada funciona com o MySQL, veja o exemplo do código que fiz: // Make a MySQL Connection $query = "SELECT * FROM dicionario"; $texto = "O joão caiu e partiu a escapula e o umero"; //$texto = htmlentities($texto,ENT_NOQUOTES,'UTF-8'); $result = mysql_query($query) or die(mysql_error()); while($row = mysql_fetch_array($result)){ string = str_replace($row['nome'], $row['link'], $texto); } echo $string;Se puder corrige este código aonde estou cometendo o erro. Obrigado pela ajuda Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Maio 14, 2009 o problema que está tendo talvez seja relacionado a encoding / charset, não ? Compartilhar este post Link para o post Compartilhar em outros sites
mbraganca 0 Denunciar post Postado Maio 14, 2009 o problema que está tendo talvez seja relacionado a encoding / charset, não ?Não me parece. Estou a usar nomes sem acentos, cedilhas, etc. Ele substitui cada palavra, gerando frases em numero igual ao match. A ideia deve ser gerar uma unica frase, em que todos os matches dessa frase com o campo "nome" da base de dados "dicionario", sejam substituidos pelo valor do campo "link" (dessa db). Pode ser algo mt simples que nao esteja a ver. Obrigado pelo vosso continuo apoio. M. Compartilhar este post Link para o post Compartilhar em outros sites
mbraganca 0 Denunciar post Postado Maio 14, 2009 Mudei para php5. usando o str_ireplace, funciona: //String a filtrar $texto = "O joao caiu e partiu a escapula e o umero"; // Ligacao ao MySQL mysql_connect($host,$username,$password); @mysql_select_db($database) or die( "Impossivel seleccionar a base de dados"); $query = "SELECT * FROM dicionario"; $result = mysql_query($query) or die(mysql_error()); while($row = mysql_fetch_array($result)){ $texto = str_ireplace($row['nome'], $row['link'], $texto); } echo $texto; Para quem não tem str_ireplace pode sempre usar: <?php if(!function_exists('str_ireplace')) { function str_ireplace($search, $replace, $subject, &$count = 0) { if(is_array($subject)) { foreach($subject as &$subj) { $subj = str_ireplace($search, $replace, $subj, $count); } return $subject; } if(is_array($search)) { $isReplArr = is_array($replace); if(!$isReplArr) $replacement = $replace; while(($needle = array_pop($search)) !== NULL) { if($isReplArr) { if(empty($replace)) $replacement = ''; else $replacement = array_pop($replace); } $subject = str_ireplace($needle, $replacement, $subject, $count); } return $subject; } if(($pos = stripos($subject, $search)) === FALSE) return $subject; ++$count; return substr($subject, 0, $pos).$replace.substr($subject, $pos + strlen($search)); } } ?> Compartilhar este post Link para o post Compartilhar em outros sites