Ir para conteúdo

POWERED BY:

Arquivado

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

mbraganca

Preg_replace dinâmico

Recommended Posts

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

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

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

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

AInda não entendi bem o que você quer.

DB: dicionario

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

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

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

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

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

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

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

×

Informação importante

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