Ir para conteúdo
Fórum Script Brasil
  • 0

Sistema De Busca


Aerial-man

Pergunta

Olá pessoal, estou aprendendo a linguagem php e construindo um site, mas surgiu um problema, quero colocar um sistema de busca, que procure em todos os arquivos do meu site e tal, sei que existem inumeros scripts prontos mas por ser iniciante e gostar muito do php queria a ajuda de você para construir esse sistema, assim seria melhor! e também ficaria no forum como se fazer porque até agora não encontrei nenhum tutorial a respeito em lugar nenhum, os que tem são buscas em banco de dados MySQL!!

Editado por Aerial-man
Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Bom, tem duas coisas, se o teu site é dinâmico, não vale a pena fazer um sistema de busca que procure em todos os arquivos por um texto expecífico... melhor fazer busca em banco de dados mesmo.

A não ser que parte do site seja html, e nestes arquivos a busca seria utilizada, nos demais busca por banco de dados.

Verdade, não tem nada "meio que pronto" se tratando em busca em arquivos físicos no servidor... mas a lógica seria mais ou menos esta na minha concepção...

Vai para o raíz do site, lendo os arquivos do diretório...

os arquivos que são .htm ou .html são abertos, o seu valor (código fonte) é colocado em uma variável, e se busca pelo valor da busca neste texto na variável, se encontrou, coloca em uma outra variével do tipo array o nome do arquivo físico e o texto que vem antes e depois daquilo que foi procurado. O texto limpo, sem formatação html.

Fecha este arquivo, passa para o outro e faz o mesmo, se encontrar faz a mesma coisa,

e vai passando esta rotina em todos os subdiretórios.

você vai precisar saber ler um diretório, abrir arquivos, funções para compara e encontrar strigns, vai ter que limpar o html do arquivo onde foi encontrado o texto e depois é só trazer na tela em um ambiente legalzinho tipo google..

http://www.php.net/manual/pt_BR/class.dir.php

http://www.php.net/manual/pt_BR/function.fopen.php

http://www.php.net/manual/pt_BR/function.substr.php

http://www.php.net/manual/pt_BR/function.strstr.php

bom, se outra pessoa tiver uma idéia de implementação mais simples... também gostria de saber....

Editado por heltonritter
Link para o comentário
Compartilhar em outros sites

  • 0

Cara gostei muito da sua resposta, é justamente isso que eu quero: a lógica de fazer, as funções da pra desenrolar, mas o que pega quando se está aprendendo uma liguagem é a lógica, valeu!

é que boa parte do site contém páginas estáticas (html) dai eu achei viável essa busca diretamente no arquivo, quanto a essa lógica que você passou eu vou testar aqui, a maioria das funções que ela usa da pra fazer legal!!! também vou ler os links que você passou para ter mais noção, qualquer coisa eu retorno!!

valeu pela ajuda!

Editado por Aerial-man
Link para o comentário
Compartilhar em outros sites

  • 0

Tenho uma função que desenvolvi a agum tempo para limpar todo o html de uma string

segue abaixo:

function SDClearHTMLfromText($texto)
    {
        $texto=trim($texto); // tira os espaços em branco no início e fim do texto
        $nrotagshtml=(substr_count($texto,'<') * 2); // conta quantas vezez aparece no texto a string <
        for ($hy=0;$hy<=$nrotagshtml;$hy++)
            {
                $posabrehtml=strpos($texto,'<'); // tag que inicia um html
                
                $posfechahtml=(strpos(substr($texto,$posabrehtml),'>')+1); // tag que fecha um html

                $retirar=(substr($texto,$posabrehtml,$posfechahtml)); // sentença html a retirar do texto
                
                if (strlen($retirar)>=2) // só entra se foi encontrado no mínimo 2 caracteres a retirar
                    {
                        $retirados.=('Ini:'.$posabrehtml."\nFin: ".$posfechahtml."\n".$retirar."\n*************************\n");
                        $texto=(str_replace($retirar,'',$texto)); // texto recebe o que tinha em texto menos a tag retirada(substituida por nada)
                    }
            }
        return($texto);
    }

Abre a página...

$ArquivoAberto=(fopen($FileSendoVerificadoAgora,'r'));

$TextoDesteFile=(fread($ArquivoAberto,filesize($FileSendoVerificadoAgora)));

$TextoLimpo=SDClearHTMLfromText($TextoDesteFile);

nesta variável $TextoLimpo você aplica a busca.

Link para o comentário
Compartilhar em outros sites

  • 0

1 - conta quantos caracteres tem o texto procurado strlen($texto)

http://scriptbrasil.com.br/forum/index.php?showtopic=96330

2 - pega em que posição do texto limpo foi encontrado a primeira ocorência do valor da tua busca...

strpos();

http://www.php.net/manual/pt_BR/function.strpos.php

3 - Do resultado de strpos diminui uns 100 - gaurda este valor em uma variável

4 - Do resultado de strpos soma o que deu em strlen + uns 100 - guarda em uma variável

ou seja você vai pegar uma faixa de caracteres antes da ocorência e depois da ocorência da busca...

aí aplica um substr ...

http://www.php.net/manual/pt_BR/function.substr.php

com o texto todo iniciando na variável do 3 e terminando na variável do 4

gauda o resultado deste substr em uma outra variável... pronto... você tem um trecho do texto em que aparece o valor pelo qual foi pesquisado... há depois de ter isso certinho... você pode deixar neste trecho de texto em negrito o valor pesquisado.....

http://www.php.net/manual/pt_BR/function.eregi-replace.php

mais ou menos é isso.

Bom trabalho.

Link para o comentário
Compartilhar em outros sites

  • 0

segui o raciocínio e deu isso:

<?php
$descricao = $_GET['descricao'];
function SDClearHTMLfromText($texto)
    {
        $texto=trim($texto); // tira os espaços em branco no início e fim do texto
        $nrotagshtml=(substr_count($texto,'<') * 2); // conta quantas vezez aparece no texto a string <
        for ($hy=0;$hy<=$nrotagshtml;$hy++)
            {
                $posabrehtml=strpos($texto,'<'); // tag que inicia um html
                
                $posfechahtml=(strpos(substr($texto,$posabrehtml),'>')+1); // tag que fecha um html

                $retirar=(substr($texto,$posabrehtml,$posfechahtml)); // sentença html a retirar do texto
                
                if (strlen($retirar)>=2) // só entra se foi encontrado no mínimo 2 caracteres a retirar
                    {
                        $retirados.=('Ini:'.$posabrehtml."\nFin: ".$posfechahtml."\n".$retirar."\n*************************\n");
                        $texto=(str_replace($retirar,'',$texto)); // texto recebe o que tinha em texto menos a tag retirada(substituida por nada)
                    }
            }
        return($texto);
    }

$dir = "busca";
$abredir = opendir($dir);
while ($arqs = readdir($abredir)) {
    if ($arqs != "." && $arqs != ".." && is_file($arqs) && ereg(".htm", $arqs)) {
        $abre = fopen($arqs,"r");
        $le = (fread($abre,filesize($arqs)));
        $TextoLimpo = SDClearHTMLfromText($le);
        $num_car = strlen($descricao);
        $pesq = strpos($TextoLimpo,$descricao);
        $antes = $pesq - 100;
        $depois = $pesq + $num_car + 100;
        $parcial = substr($TextoLimpo,$antes,$depois);
        $desc_style = "<b>$descricao</b>";
        $final = ereg_replace($descricao,$desc_style,$parcial);
        echo "$final<br><br>";
closedir($abredir);
}
}
?>

mas quando boto para pesquisar algo não retorna nenhum resultado nem mostra nenhum erro, simplesmente a tela fica em branco, o que está errado???

Link para o comentário
Compartilhar em outros sites

  • 0

mas quando boto para pesquisar algo não retorna nenhum resultado nem mostra nenhum erro, simplesmente a tela fica em branco, o que está errado???

Consegui resolver isso, o erro foi ter colocado o closedir dentro do if e do while, mas vi outro erro:

Ele estava mostrando um pedaço de todos os arquivos, os que tem o termo procurado tá sendo mostrado legal só que os outros aparecem sem ter a palavra pesquisada, sulucionei colocando uma condição para mostrar apenas quando tiver o termo!

<?php
$descricao = $_GET['descricao'];
function SDClearHTMLfromText($texto)
    {
        $texto=trim($texto); // tira os espaos em branco no incio e fim do texto
        $nrotagshtml=(substr_count($texto,'<') * 2); // conta quantas vezez aparece no texto a string <
        for ($hy=0;$hy<=$nrotagshtml;$hy++)
            {
                $posabrehtml=strpos($texto,'<'); // tag que inicia um html
                
                $posfechahtml=(strpos(substr($texto,$posabrehtml),'>')+1); // tag que fecha um html

                $retirar=(substr($texto,$posabrehtml,$posfechahtml)); // sentena html a retirar do texto
                
                if (strlen($retirar)>=2) // s entra se foi encontrado no mnimo 2 caracteres a retirar
                    {
                        $retirados.=('Ini:'.$posabrehtml."\nFin: ".$posfechahtml."\n".$retirar."\n*************************\n");
                        $texto=(str_replace($retirar,'',$texto)); // texto recebe o que tinha em texto menos a tag retirada(substituida por nada)
                    }
            }
        return($texto);
    }

$dir = "busca";
$abredir = opendir($dir);
while ($arqs = readdir($abredir)) {
    if ($arqs != "." && $arqs != ".." && is_file($arqs) && ereg(".htm", $arqs)) {
        $abre = fopen($arqs,"r");
        $le = (fread($abre,filesize($arqs)));
        $TextoLimpo = SDClearHTMLfromText($le);
        $num_car = strlen($descricao);
        $pesq = strpos($TextoLimpo,$descricao);
    if ($pesq == FALSE) {} else {
        $antes = $pesq - 100;
        $depois = $pesq + $num_car + 100;
        $parcial = substr($TextoLimpo,$antes,$depois);
        $desc_style = "<b>$descricao</b>";
        $final = ereg_replace($descricao,$desc_style,$parcial);
        echo "$final<br><br>";
}
}
}
closedir($abredir);
?>

´

agora é só fazer algumas mudanças para ficar com uma aparência melhor!!

muito obrigado heltonritter!!!!!! :D

Editado por Aerial-man
Link para o comentário
Compartilhar em outros sites

  • 0

Lendo e aprendendo.....fim de semana foi produtivo....

isso:

function SDClearHTMLfromText($texto)
    {
        $texto=trim($texto); // tira os espaos em branco no incio e fim do texto
        $nrotagshtml=(substr_count($texto,'<') * 2); // conta quantas vezez aparece no texto a string <
        for ($hy=0;$hy<=$nrotagshtml;$hy++)
            {
                $posabrehtml=strpos($texto,'<'); // tag que inicia um html
                
                $posfechahtml=(strpos(substr($texto,$posabrehtml),'>')+1); // tag que fecha um html

                $retirar=(substr($texto,$posabrehtml,$posfechahtml)); // sentena html a retirar do texto
                
                if (strlen($retirar)>=2) // s entra se foi encontrado no mnimo 2 caracteres a retirar
                    {
                        $retirados.=('Ini:'.$posabrehtml."\nFin: ".$posfechahtml."\n".$retirar."\n*************************\n");
                        $texto=(str_replace($retirar,'',$texto)); // texto recebe o que tinha em texto menos a tag retirada(substituida por nada)
                    }
            }
        return($texto);
    }
pode ser substituido por isso:
 $string = strip_tags($string);

http://www.php.net/manual/pt_BR/function.strip-tags.php

hehehehe

é isso aí galera...

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...