Jump to content


Photo

Negritar Resultados De Uma Consulta


  • Faça o login para participar
17 replies to this topic

#1 pchardnet

pchardnet

    ×-× 3D ×-×

  • Usuários
  • 1068 posts
  • Sexo:Não informado
  • Localidade:Belo Horizonte-MG

Posted 09/09/2005, 13:39

Moçada, eu criei este scriptzinho abaixo com intenção de negritar a palavra pesquisada. Ótimo, para isso ele funciona muito bem. Mas tenho um pequeno problema. Se a pesquisa utilizar duas palavras que constem no nome nada me é retornado.

Ex.:
1 - Se a pesquisa for por Machado ele retorna Glaucia Maria Machado Rocha Ribeiro

2 - Se a pesquisa for por Maria Machado ele não me retorna nada, pois o script só pega uma palavra.


<?
$palavra = "Machado"; //palavra a ser pesquisada
$res  = "Glaucia Maria Machado Rocha Ribeiro"; //string onde a palavra será pesquisada

$parts = explode(" ", $res); // divide a string onde tem espaços
$cont = count($parts); // conta em qtas partes a string $res foi dividida

for ( $i=0; $i<=$cont; $i++){  // percorre o array
	if ($palavra==$parts[$i]){ // se a posição do array corresponder com a palavra
  $parts[$i] = "<b>" . $palavra . "</b>"; //grava na posição a palavra em negrito
  $result = implode(" ", $parts); // volta com array
  }
}

echo $result; // imprime a string com a palavra em negrito
?>

www.wvirtu.net - Hospedagem Sites - PHP + MySql + Fantástico - Joomla! pré-instalado

www.joomlaminas.org - Grupo de Usuários Joomla! de Minas Gerais

#2 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 09/09/2005, 14:15

Eita, o que seria dos programadores se não existissem as ER (expressões regulares) ? :blink:
<?php

$palavra = 'Machado';
$res = 'Glaucia Maria Machado Rocha Ribeiro';

$res = preg_replace('~(.*?)(' . $palavra . '?)(.*?)~', '\\1<strong>\\2</strong>\\3', $res);

print $res;

?>
[]’s :DAté mais

#3 fly2k

fly2k

    Super Veterano

  • Usuários
  • 2262 posts
  • Sexo:Não informado

Posted 09/09/2005, 14:15

Lógico. Quer dizer, seu código está ilógico.

Vejamos, leia seu código para entender =)

Leia com atenção!
Quer aprender PHP? -> www.manjaphp.com.br
Tutoriais, código colaborativo (pastebin), curso de PHP, artigos e etc.

#4 pchardnet

pchardnet

    ×-× 3D ×-×

  • Usuários
  • 1068 posts
  • Sexo:Não informado
  • Localidade:Belo Horizonte-MG

Posted 09/09/2005, 14:20

Lógico. Quer dizer, seu código está ilógico.

Vejamos, leia seu código para entender =)

Leia com atenção!

Desculpe mas não entendi...



// Paulo Freitas //

Sua expressão funciona legal, mas vou abusar um pouquinho mais de vc... permite?

Se a busca for por?

1 - Maria Rocha - tem como negritar as duas palavras nesta string?

2 - Se a busca for por Maria, tem como tratar nomes derivados? Ex.: Mariana = Mariana

(y)
www.wvirtu.net - Hospedagem Sites - PHP + MySql + Fantástico - Joomla! pré-instalado

www.joomlaminas.org - Grupo de Usuários Joomla! de Minas Gerais

#5 goiaba2000

goiaba2000

    Tô com sono!

  • Usuários
  • 1118 posts
  • Sexo:Não informado
  • Localidade:Sobradinho-DF

Posted 09/09/2005, 14:25

olha isso:
http://www.ibrad.org...sca&Busca=ficam

pega o javascript qu tem la.

no php fica assim:
function Conteudo($conteudo1,$conteudo2,$busca){
	$tamanho	= 100;
	$metade  = $tamanho/2;
	$inicio1	= strpos($conteudo1,$busca);
	$inicio2	= strpos($conteudo2,$busca);

	if($inicio1){
  $conteudo	= $conteudo1;
  $inicio  = $inicio1	- $metade;
	}
	else if($inicio2){
  $conteudo	= $conteudo2;
  $inicio  = $inicio2	- $metade;
	}
	if($inicio<0){
  $inicio	= 0;
	}
	
	if($inicio1 || $inicio2){
  $saida	= "...".substr($conteudo,$inicio,$tamanho)."...";
	}
	else{
  $saida	= substr($conteudo1,0,$tamanho)."...";
	}
	return $saida;
}

os parametros da função:
- conteudo1:
Qualquer texto.
- conteudo2:
Qualquer texto.
- busca:
palavra ou expressão a ser buscada.

PS.: o conteudo1 tem prioridade, ou seja, se a busca for encontrada no conteudo1, ela não será procurada no conteudo2.
PHP + UML + OO + Flash + MySQL = IMBATIVEL

http://www.guilardi.com.br
- portifólio
http://www.deusehmais.com.br
- projeto atual

#6 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 09/09/2005, 14:28

Esta "minha" ER é bem abrangente. Mesmo se $palavra for apenas uma letra, todas estas letras que conterem na variável $res serão transformadas em negrito. :)

Logo, se $palavra for a:

Glaucia Maria Machado Rocha Ribeiro

Se $palavra for R:

Glaucia Maria Machado Rocha Ribeiro

Se $palavra for Maria Machado:

Glaucia Maria Machado Rocha Ribeiro

E por aí vai ... ^_^

Entendeu ? :rolleyes:

PS: Se desejar torná-la case-insensitive, basta adicionar um i após o segundo til (~) da expressão. ;)

[]’s :DAté mais

#7 goiaba2000

goiaba2000

    Tô com sono!

  • Usuários
  • 1118 posts
  • Sexo:Não informado
  • Localidade:Sobradinho-DF

Posted 09/09/2005, 14:36

ah... esta função que te passei posiciona a expressão encontrada no meio do texto (como no google). ou seja, mostra exatamente onde a palavra foi encontrada. se você der uma misturada do codigo do vidaloca com a função q te dei vai ficar 10!

faz assim:

function Conteudo($conteudo1,$conteudo2,$busca){
$tamanho = 100;
$metade  = $tamanho/2;
$inicio1 = strpos($conteudo1,$busca);
$inicio2 = strpos($conteudo2,$busca);

if($inicio1){
 $conteudo = $conteudo1;
 $inicio  = $inicio1 - $metade;
}
else if($inicio2){
 $conteudo = $conteudo2;
 $inicio  = $inicio2 - $metade;
}
if($inicio<0){
 $inicio = 0;
}

if($inicio1 || $inicio2){
 $saida = "...".substr($conteudo,$inicio,$tamanho)."...";
}
else{
 $saida = substr($conteudo1,0,$tamanho)."...";
}
$saida= preg_replace('~(.*?)(' . $busca . ')?(.*?)~', '\\1<strong>\\2</strong>\\3', $saida);
return $saida;
}

PHP + UML + OO + Flash + MySQL = IMBATIVEL

http://www.guilardi.com.br
- portifólio
http://www.deusehmais.com.br
- projeto atual

#8 pchardnet

pchardnet

    ×-× 3D ×-×

  • Usuários
  • 1068 posts
  • Sexo:Não informado
  • Localidade:Belo Horizonte-MG

Posted 09/09/2005, 14:41

Esta "minha" ER é bem abrangente. Mesmo se $palavra for apenas uma letra, todas estas letras que conterem na variável $res serão transformadas em negrito. :)

Logo, se $palavra for a:

Glaucia Maria Machado Rocha Ribeiro

Se $palavra for R:

Glaucia Maria Machado Rocha Ribeiro

Se $palavra for Maria Machado:

Glaucia Maria Machado Rocha Ribeiro

E por aí vai ... ^_^

Entendeu ? :rolleyes:

PS: Se desejar torná-la case-insensitive, basta adicionar um i após o segundo til (~) da expressão. ;)

[]’s :D

Opa... saquei sim... ou melhor estou sacando...rs

Veja bem... se eu optar por Glaucia Ribeiro a ER não negrita nada...

Já Glaucia Maria ela negrita...

Parece que esta ER só "funciona" com palavras sequenciais....

Estou errado?

Se puder faça um teste e verifique o que estou dizendo.



Ah, deixe uma referencia sobre ER aí pra eu poder aprender... achei bem interessante
www.wvirtu.net - Hospedagem Sites - PHP + MySql + Fantástico - Joomla! pré-instalado

www.joomlaminas.org - Grupo de Usuários Joomla! de Minas Gerais

#9 goiaba2000

goiaba2000

    Tô com sono!

  • Usuários
  • 1118 posts
  • Sexo:Não informado
  • Localidade:Sobradinho-DF

Posted 09/09/2005, 14:49

cara.. vo te dar um ideia.
como vc quer que o programa encontre as palavras em qualquer ordem???? isso é loucura.

mas uma saida seria a seguinte:
coloque as palavras da busca dentro de uma array;
depois use foreach(); e dentro dele chame a função Conteudo().



REFERENCIA DO PREG_REPLACE:
http://www.php.net/m...reg-replace.php
PHP + UML + OO + Flash + MySQL = IMBATIVEL

http://www.guilardi.com.br
- portifólio
http://www.deusehmais.com.br
- projeto atual

#10 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 09/09/2005, 15:51

Corrigi um pequeno probleminha na ER do código anterior. :(

Então ... fácil fácil ! :rolleyes:
<?php

$palavra = 'Glaucia Ribeiro';

$res = 'Glaucia Maria Machado Rocha Ribeiro';

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

foreach($palavras as $palavra)
{
  $res = preg_replace('~(.*?)(' . $palavra . '?)(.*?)~', '\\1<strong>\\2</strong>\\3', $res);
}

print $res;

?>

Ótima fonte de estudo sobre ER's: guia-er.sf.net (em português brasileiro)

[]’s :DAté mais

#11 pchardnet

pchardnet

    ×-× 3D ×-×

  • Usuários
  • 1068 posts
  • Sexo:Não informado
  • Localidade:Belo Horizonte-MG

Posted 09/09/2005, 17:06

Muito bom...

Obrigado (y)
www.wvirtu.net - Hospedagem Sites - PHP + MySql + Fantástico - Joomla! pré-instalado

www.joomlaminas.org - Grupo de Usuários Joomla! de Minas Gerais

#12 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 10/09/2005, 02:44

Só por curiosidade, nem precisava utilizar laço de repetição Paulo Freitas.
Não sei se você tinha reparado.

Mas o | é um meta-caracter da ER, certo!?
Então encontrado ele na string, irá ser tratado com o opcional usado nas expressões regulares.

Traduzindo para o código, ficaria:
<?php

$palavra = 'Glaucia Ribeiro';

$res = 'Glaucia Maria Machado Rocha Ribeiro';

$palavras = str_replace(" ", "|", $palavra);

$res = preg_replace('~(.*?)('. $palavras . ')(.*?)~', '\\1<strong>\\2</strong>\\3', $res);

print $res;

?>


[]'s
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#13 pchardnet

pchardnet

    ×-× 3D ×-×

  • Usuários
  • 1068 posts
  • Sexo:Não informado
  • Localidade:Belo Horizonte-MG

Posted 10/09/2005, 13:14

Opa, não percebi isso ...

No momento estou fora do meu trabalho, mas na segunda feira assimque chegar lá vou verificar isso.

Preciso tb estudar ER pra entender melhor

(y)
www.wvirtu.net - Hospedagem Sites - PHP + MySql + Fantástico - Joomla! pré-instalado

www.joomlaminas.org - Grupo de Usuários Joomla! de Minas Gerais

#14 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 10/09/2005, 13:33

Só por curiosidade, nem precisava utilizar laço de repetição Paulo Freitas.
Não sei se você tinha reparado.

Mas o | é um meta-caracter da ER, certo!?
Então encontrado ele na string, irá ser tratado com o opcional usado nas expressões regulares.

Não percebi mesmo ! Aliás, isto nem passou pela minha cabeça ... :unsure:

Devia ser o sono ... :P

Mas ... o teu ficou melhor, sem dúvidas ! ^_^

[]’s :DAté mais

#15 CSFInfo

CSFInfo

    Normal

  • Usuários
  • 81 posts
  • Sexo:Não informado

Posted 12/09/2005, 00:21

Seria bom colocar entre /b... /b para destacar a palavra exata?

<?php

$palavra = 'Glaucia Ribeiro';

$res = 'Glaucia Maria Machado Rocha Ribeiro';

$palavras = str_replace(" ", "|", $palavra);

$res = preg_replace('~(.*?)\b('. $palavras . ')\b(.*?)~', '\\1<strong>\\2</strong>\\3', $res);

print $res;

?>

Edição feita por: CSFInfo, 12/09/2005, 00:26.





1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq