← Tutoriais

[PHP] Motor de Busca

Lida 5242 vezes

Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Um script que comecei ontem apenas porque não tinha mais nada para fazer, hoje terminei-o e resolvi partilhar.

É um sistema de busca muito simples de configurar e que utiliza a função get_meta_tags para retornar resultados, portanto não usa SQL nem 'flat files'.

Não é muito rápido, mas para pequenas buscas penso que faz o serviço,
se bem que php não é a solução ideal para uma coisa deste género....  :?  

Comentei o código com as descrições e procedimentos mais importantes,
para que possam fazer copy & paste e saber como utiliza-lo um dia mais tarde quando se esquecerem de onde o tiraram :)

Caso alguem resolva utilizar o código, só peço é que não retirem os créditos comentados dentro do php e no html.

Código: [Seleccione]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
  <title>Coded by =IceBurn= (WWW.TENHAMEDO.NET)</title>
  <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  <style type="text/css">
body      { font-family: arial,sans-serif; color: black; background:  white; }
.p        { font-size:8pt; color:blue; }
a:link    { color: blue;   text-decoration: underline; }
a:active  { color: red;    text-decoration: underline; }
a:visited { color: #551a8; text-decoration: underline; }
  </style>
 </head>

<!--   Coded by =IceBurn= 2006
W W W . T E N H A M E D O . N E T  -->

<?php
//**********************************************************// 
//      #   Sistema  Simples  de  Pesquisa  em  PHP   #     // 
//             !! Por favor deixe os créditos !!            // 
//                    Coded  by  =IceBurn=                  // 
//                     WWW.TENHAMEDO.NET                    // 
//**********************************************************// 

/*------------------------- !! IMPORTANTE !! -----------------------------
Para o correcto funcionamento do script,
todas as páginas a pesquisar necessitam de 
pelo menos duas meta tags, description e keywords.

Exemplo&#58;
<meta name="keywords" content="php, iceburn">
<meta name="description" content="Sistema Simples de Pesquisa em PHP">

As tags <title>Exemplo.com</title> tambem são requeridas.
------------------------------------------------------------------------*/ 

/* Retira os espaços no início e final
   da string e garante que o valor definido
   com maxlength. */
$q substr&#40;trim&#40;$_GET['q'&#93;&#41;,0,35&#41;; 

print '
<div align="center">
<form action="'
.$_SERVER['PHP_SELF'&#93;.'" method="get" title="Pesquisar">
<input name="q" type="text" size="25" maxlength="35"/>
<
input type="submit" value="Pesquisar" onclick="this.disabled=true;this.value=\'A pesquisar...\'; this.form.submit&#40;&#41;;"/>
</
form>
</
div>';

if&#40;!empty&#40;$q&#41;&#41;
&#123;
/* A maioria dos servidores está preparado
   para limitar a execução de um script se
   este ultrapassar 30 segundos. 
  &#40;A pré definição são 60 segundos&#41;
  Para evitar erros caso o tempo de execução
  ultrapasse o valor definido pelo servidor
  esta é a solução. */
set_time_limit&#40;0&#41;; 
 
/* É importante filtrar caracteres indesejados
   que poderiam comprometer a execução da pesquisa. */
$q = str_replace&#40;array&#40;".", "&", "#", "$", "+", "-",'"',"'","/","\\","*","<",">"&#41;, "", $q&#41;;

/* Aqui começa a configuração&#58;
   Deves indicar todas as páginas que
   pretenderes que sejam pesquisadas.
   Basta meter os URL das páginas, sejam
   páginas php, html, xhtml, etc, etc...*/
$paginas = array&#40;                          
"http&#58;//teste.com/index.php",              
"http&#58;//teste.com/menu.html",              
"http&#58;//teste.com/pagina/index.php",       
"http&#58;//teste.com/dir/teste.php?u=teste"
&#41;;

/* É tipo baralhar de cartas, neste
   caso as cartas são as páginas ;&#41; */
sort&#40;$paginas, SORT_REGULAR&#41;; 

/* Fazemos um loop pelas páginas */
for&#40;$i = 0; $i < count&#40;$paginas&#41;; $i++&#41; &#123; 

/* A função principal está aqui */
$tags = @get_meta_tags&#40;$paginas[$i&#93;&#41;; 

/* Verificamos se a meta tag description existe ou se não está vazia */  
  if &#40;!empty&#40;$tags["description"&#93;&#41;&#41; 
     &#123;  
   //-- Aqui procuramos a palavra chave e... --//
      if&#40;preg_match&#40;"/&#40;.*?&#41;&#40;$q&#123;0&#125;&#41;&#40;.*&#41;/i", $tags["description"&#93;&#41;&#41; 
        &#123;
  //-- ...se encontrada, guardamos o link da página numa array --//
         $resultados[&#93; = $paginas[$i&#93;; 
         
 //-- Somamos os resultados --//
 $valores++; 
         $encontrado = 1; 
        &#125;
     &#125;
  
  /* Segue-se a busca mas agora nas meta tags keywords... */
  if &#40;!empty&#40;$tags["keywords"&#93;&#41; && $encontrado < 1&#41; 
     &#123; 
    if&#40;preg_match&#40;"/&#40;.*?&#41;&#40;$q&#123;0&#125;&#41;&#40;.*&#41;/i", $tags["keywords"&#93;&#41;&#41;
      &#123;
       $resultados[&#93; = $paginas[$i&#93;;
       $valores++;
      &#125;
     &#125;
  
  
  if &#40;$encontrado&#41;
     &#123;
 /* Quando encontramos as palavras chaves
     na meta tag da descrição, 
     guardamo-las numa nova array, para as
     apresentar juntamente com o resultado */
      $x_descricao[&#93; = $tags["description"&#93;;
      
  /* Comos andamos as voltas dentro de um loop, &#58;&#41;
         é necessário definir a variavel $encontrado
         novamente para 0 */
  $encontrado  = 0; 
     &#125;
&#125;

/* Contamos os resultados... */
$valores = count&#40;$resultados&#41;;

/* Caso a pesquisa tenha encontrado resultados... */
if &#40;$valores > 0&#41;
&#123;
  echo "<b>";
 if &#40;$valores=="1"&#41;
  echo "Encontrado $valores resultado";
 else
  echo "Encontrados $valores resultados";
 
  echo " para <em>$q</em>&#58;</b><br/><br/>\n";


echo "<table width=\"80%\" align=\"center\">\n";
  
  for&#40;$i = 0; $i < $valores; $i++&#41; &#123;
  /* Ainda não terminamos... Falta-nos o título para apresentar!! 
     Assim, o script vai ler a página a procura das tags <title> */ 
     $leitura = fopen&#40;$resultados[$i&#93;, "r"&#41;;
     
     /* Para poupar recursos e tempo, começamos por ler 220 bytes
   da página, o que normalmente é suficiente.... */
     eregi&#40;"<title>&#40;.*&#41;</title>", fread&#40;$leitura, 220&#41;, $x_titulo&#41;;
     
 /* Caso 220 bytes não chegem para alcançar 
    as tags <title>, vamos ler novamente a página,
mas desta vez aumentamos a leitura para 1 Kb */
  if&#40;$x_titulo[1&#93; == ""&#41; &#123;
 eregi&#40;"<title>&#40;.*&#41;</title>", fread&#40;$leitura, 1024&#41;, $x_titulo&#41;;
   &#125;
     fclose&#40;$leitura&#41;;
   echo "<tr>
    <td>";
    
    /* Finalmente, apresentamos os resultados da pesquisa. */
    echo "<a href=\"".htmlspecialchars&#40;$resultados[$i&#93;&#41;."\">".htmlspecialchars&#40;$x_titulo[1&#93;&#41;."</a><br/>\n";
    echo eregi_replace&#40;$q, "<b>$q</b>", htmlspecialchars&#40;$x_descricao[$i&#93;&#41;&#41;." <br/>\n";
    echo "<font color=\"green\" size=\"2\">".htmlspecialchars&#40;$resultados[$i&#93;&#41;."</font><br/><br/>\n";
    echo "</td>
</tr>";
   &#125;

echo "</table>\n";
&#125; else &#123; /* Para o caso de não serem encontrados resultados na pesquisa */
   echo "<div align=\"center\">Não foram encontrados resultados para a sua pesquisa.</div>\n";
 &#125;
&#125;
?>

  <br/>
  <div align="center">
   <hr width="80%">
   <p class="p">
    Sistema  Simples  de  Pesquisa  em  PHP<br/>
    Elaborado por =IceBurn= &copy; <a href="http://www.tenhamedo.net">www.tenhamedo.net</a>
   </p>
  </div>
 </body>
</html>


Enjoy  :wink:
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Actualizei o código adicionando uma função que retira a acentuação das
palavras para resultados mais fiáveis...

Inseri tambem a contagem do tempo de pesquisa.


Código: [Seleccione]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
  <title>Coded by =IceBurn= (WWW.TENHAMEDO.NET)</title>
  <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  <style type="text/css">
body      { font-family: arial,sans-serif; color: black; background:  white; }
.p        { font-size:8pt; color:blue; }
a:link    { color: blue;   text-decoration: underline; }
a:active  { color: green;    text-decoration: underline; }
a:visited { color: #551a8; text-decoration: underline; }
  </style>
 </head>
<table width="90%" align="center">
 <tr>
  <td>
<!--   Coded by =IceBurn= 2006
W W W . T E N H A M E D O . N E T  -->

<?php 
//**********************************************************// 
//   #  Sistema  Simples  de  Pesquisa  em  PHP  v1.1  #    // 
//             !! Por favor deixe os créditos !!            // 
//                    Coded  by  =IceBurn=                  // 
//                     WWW.TENHAMEDO.NET                    // 
//**********************************************************// 

/*
------------------------- !! IMPORTANTE !! ----------------------------
Para o correcto funcionamento do script, 
todas as páginas a pesquisar necessitam de 
pelo menos duas meta tags, description e keywords. 

Exemplo&#58; 
<meta name="keywords" content="php, iceburn"> 
<meta name="description" content="Sistema Simples de Pesquisa em PHP"> 

As tags <title>Exemplo.com</title> tambem são requeridas. 
------------------------------------------------------------------------
*/ 


/* 
  Função Que Retira a acentuação das Palavras 
*/
function RetirarAcentos&#40;$frase&#41; &#123;
 
 
$frase str_replace&#40;array&#40;"à","á","â","ã","ä","è","é","ê","ë","ì","í","î","ï","ò","ó","ô","õ","ö","ù","ú","û","ü","À","Á","Â","Ã","Ä","È","É","Ê","Ë", "Ì","Í","Î","Ò","Ó","Ô","Õ","Ö","Ù","Ú","Û","Ü","ç","Ç","ñ","Ñ"&#41;, 
                      
array&#40;"a","a","a","a","a","e","e","e","e","i","i","i","i","o","o","o","o","o","u","u","u","u","A","A","A","A","A","E","E","E","E","I","I","I","O","O","O","O","O","U","U","U","U","c","C","n","N"&#41;, $frase&#41;;

return $frase;                            
&
#125;


/* 
  Retira os espaços no início e final da 
  string  e garante que o valor definido 
  com   maxlength  não  é  ultrapassado. 
*/ 
$q substr&#40;trim&#40;$_GET['q'&#93;&#41;,0,35&#41;; 

print 
<div align="center"> 
 <form action="'
.$_SERVER['PHP_SELF'&#93;.'" method="get" title="Pesquisar"> 
  
<table>
   <
tr valign="top">
    <
td width="50%">
     <
input name="q" type="text" size="25" maxlength="35"/> 
    </
td><td width="50%" align="left">
     <
input type="submit" value="Pesquisar" onclick="this.disabled=true;this.value=\'A pesquisar\'; this.form.submit&#40;&#41;;"/> 
    </
td>
   </
tr>
  </
table>
 </
form>
</
div>'; 

if&#40;!empty&#40;$q&#41;&#41; 
&#123; 

/* 
  Um  pequeno  extra que vai 
  fazer a  contagem do tempo
  que o script levou a fazer
  o seu trabalho...
*/  
$inicio = microtime&#40;&#41;;
  
/* 
  A  maioria  dos  alojamentos está preparado 
  para  limitar a  execução  de um script se 
  este ultrapassar 30 segundos. 
  
  &#40;A   pré definição   são   60  segundos no 
  ficheiro de configuração do php - php.ini&#41; 
  
  Para  evitar  erros  caso o tempo de 
  execução ultrapasse o valor definido 
  pela  configuração  esta é a solução. 
*/ 
set_time_limit&#40;0&#41;; 
                
/* 
  É importante filtrar caracteres indesejados 
  que poderiam comprometer a execução da pesquisa. 
*/ 
$q = str_replace&#40;array&#40;".", "&", "#", "$", "+", "-",'"',"'","/","\\","*","<",">"&#41;, "", $q&#41;; 

/* 
  A função que retira
  a acentuação...
*/
$chave = RetirarAcentos&#40;$q&#41;;

/* 
  Aqui     começa     a    configuração&#58; 
  Deves  indicar todas as  páginas  que 
  pretenderes  que  sejam   pesquisadas. 
  Basta meter os URL das páginas, sejam 
  páginas php, html, xhtml, etc, etc...
  
  Obviamente que quanto mais URLs inserirem,
  mais  demora  o  tempo  de resposta,  logo 
  aconselho apenas a pesquisarem somente nas 
  páginas   de  conteudo  mais  relevente...
*/ 
$paginas = array&#40;                          
"http&#58;//teste.com/index.php",              
"http&#58;//teste.com/menu.html",              
"http&#58;//teste.com/pagina/index.php",        
"http&#58;//teste.com/dir/teste.php?u=teste"
&#41;; 


/* 
  É tipo baralhar de cartas, neste 
  caso as cartas são as páginas ;&#41; 
*/ 
sort&#40;$paginas, SORT_REGULAR&#41;; 


/* 
  Fazemos um loop pelas páginas 
*/ 
for&#40;$i = 0; $i < count&#40;$paginas&#41;; $i++&#41; &#123; 


/* 
  A função principal está aqui 
*/ 
$tags = @get_meta_tags&#40;$paginas[$i&#93;&#41;; 


/* 
  Verificamos se a meta tag description
  existe   ou   se   não   está   vazia 
*/  
  if &#40;!empty&#40;$tags["description"&#93;&#41;&#41; 
     &#123;  
      
  /* 
    Aqui procuramos a palavra chave e... 
  */ 
      if&#40;preg_match&#40;"/&#40;.*?&#41;&#40;$chave&#123;0&#125;&#41;&#40;.*&#41;/i", RetirarAcentos&#40;$tags["description"&#93;&#41;&#41;&#41; 
        &#123; 
        
/* 
  ...se encontrada, guardamos 
  o link da página numa array 
*/ 
         $resultados[&#93; = $paginas[$i&#93;; 
         
       
   /* 
     Somamos os resultados 
   */ 
       $valores++; 
         $encontrado = 1; 
        &#125; 
     &#125; 
  
  
  /* 
    Segue-se a busca mas agora nas meta tags keywords... 
  */ 
  if &#40;!empty&#40;$tags["keywords"&#93;&#41; && $encontrado < 1&#41; 
     &#123; 
    if&#40;preg_match&#40;"/&#40;.*?&#41;&#40;$chave&#123;0&#125;&#41;&#40;.*&#41;/i", RetirarAcentos&#40;$tags["keywords"&#93;&#41;&#41;&#41; 
      &#123; 
       $resultados[&#93; = $paginas[$i&#93;; 
       $valores++; 
      &#125; 
     &#125; 
  
  
  if &#40;$encontrado&#41; 
     &#123; 
      
  /* 
    Quando encontramos as palavras chaves 
        na    meta     tag    da    descrição, 
        guardamo-las numa nova array, para as 
        apresentar juntamente com o resultado 
  */ 
      $x_descricao[&#93; = $tags["description"&#93;; 
      
     
 /* 
   Comos andamos as voltas dentro de um loop, &#58;&#41; 
       é necessário definir a variavel  $encontrado 
       novamente para 0 
 */ 
     $encontrado  = 0; 
     &#125; 
&#125; 

/* 
  Contamos os resultados... 
*/ 
$valores = count&#40;$resultados&#41;; 

/* 
  Caso a pesquisa tenha encontrado resultados... 
*/ 
if &#40;$valores > 0&#41; 
&#123; 
  echo "<b>"; 
 if &#40;$valores=="1"&#41; 
  echo "Encontrado $valores resultado"; 
 else 
  echo "Encontrados $valores resultados"; 
  
  echo " para <em>$q</em>&#58;</b><br/><br/>\n"; 


echo "<table width=\"80%\" align=\"center\">\n"; 
  
  for&#40;$i = 0; $i < $valores; $i++&#41; &#123; 
  
  
  /* 
    Ainda não terminamos... Falta-nos o título para apresentar!! 
    Assim, o script vai ler a página a procura das tags  <title> 
  */ 
     $leitura = fopen&#40;$resultados[$i&#93;, "r"&#41;; 
      
     
 /* 
   Para  poupar  recursos  e  tempo,  começamos  por  ler 
   220 bytes da página, o que normalmente é suficiente.... 
 */ 
     eregi&#40;"<title>&#40;.*&#41;</title>", fread&#40;$leitura, 220&#41;, $x_titulo&#41;; 
      
    
/* 
  Caso  220  bytes  não  chegem  para  alcançar 
      as tags <title>, vamos ler novamente a página, 
      mas desta vez aumentamos a leitura para  1 Kb 
*/ 
  if&#40;$x_titulo[1&#93; == ""&#41; &#123; 
    eregi&#40;"<title>&#40;.*&#41;</title>", fread&#40;$leitura, 1024&#41;, $x_titulo&#41;; 
      &#125; 
     fclose&#40;$leitura&#41;; 
   echo "<tr> 
    <td>"; 
    
    /* 
  Finalmente, apresentamos os resultados da pesquisa. 
*/ 
    echo "<a href=\"".htmlspecialchars&#40;$resultados[$i&#93;&#41;."\">".htmlspecialchars&#40;$x_titulo[1&#93;&#41;."</a><br/>\n"; 
    echo eregi_replace&#40;$q, "<b>".$q."</b>", htmlspecialchars&#40;$x_descricao[$i&#93;&#41;&#41;; 
if &#40;!empty&#40;$x_descricao[$i&#93;&#41;&#41; &#123; echo "<br/>\n"; &#125;
    echo "<font color=\"green\" size=\"2\">".htmlspecialchars&#40;$resultados[$i&#93;&#41;."</font><br/><br/>\n"; 
    echo "</td> 
   </tr>"; 
   &#125; 

echo "</table>\n"; 
&#125; else &#123; 
  
  /* 
    Para o caso de não serem encontrados resultados na pesquisa 
  */ 
   echo "<div align=\"center\">Não foram encontrados resultados para a sua pesquisa.</div>\n"; 
 &#125;


/*
  Calculamos e mostramos o tempo de execução da pesquisa...
*/ 
$fim = microtime&#40;&#41;;
$tempo = number_format&#40;&#40;&#40;substr&#40;$fim,0,9&#41;&#41; + &#40;substr&#40;$fim,-10&#41;&#41; - &#40;substr&#40;$inicio,0,9&#41;&#41; - &#40;substr&#40;$inicio,-10&#41;&#41;&#41;,4&#41;;
echo "<center><font size=\"-2\">Executado em $tempo segundos</font></center>"; 
&#125; 
?>

  <br/>
    <div align="center">
     <hr width="80%">
      <p class="p">
       Sistema  Simples  de  Pesquisa  em  PHP<br/>
       Elaborado por =IceBurn= &copy; <a href="http://www.tenhamedo.net">www.tenhamedo.net</a>
      </p>
     </div>
    </td>
   </tr>
  </table>
 </body>
</html>