Programação
Motor de pesquisa tipo Google em PHP - Será que quis dizer: / Did you mean?
'; //////////////////////////////////////////////////////////////////////////////////// //definimos qual o termo a pesquisar //não pode ser nulo ou menor que 3 if ( $_GET['search']!=NULL && strlen($_GET['search'])>2 ) { $input = $_GET['search']; //echo $input; //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// //isto seria é valor da BD //tenta ver se há igual $conn = conexao(); $select = " SELECT * FROM conteudos WHERE conteudo LIKE '%".$input."%' "; //echo $select; $executa = mysql_query($select) or die (mysql_error()); $matrizAssociativa = mysql_fetch_assoc ($executa); $conta = mysql_num_rows($executa); //echo 'resultados encontrados = '.$conta.''; if ($conta > 0 ) { echo 'resultado directo!'; do{ echo ''; //echo 'id = '.$matrizAssociativa['id'].''; $conteudos = $matrizAssociativa['conteudo']; echo str_replace( $input, "".$input."", $conteudos ); } while ($matrizAssociativa = mysql_fetch_assoc ($executa) ); echo ''; } if ($conta < 1 ) { //se n houver resultado directo da BD... echo 'sem resultado directo!'; $select2 = " SELECT * FROM conteudos "; $executa2 = mysql_query($select2) or die (mysql_error()); $conta2 = mysql_num_rows($executa2); //echo '$conta2 = '.$conta2.''; $matrizAssociativa2 = mysql_fetch_assoc($executa2); $valor = ""; do { $valor.= strip_tags( $matrizAssociativa2['conteudo']).''; } while($matrizAssociativa2 = mysql_fetch_assoc($executa2) ); //echo $valor; //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// //aqui define-se os termos de comparação //criamos o armário que vai conter os valores :) $words = array(); //como popular um array em php? //uiui... eheh usamos o FOREACH //partimos os valores usando a função EXPLODE com o DELIMITADOR " " espaço $partes = explode(' ' , $valor); //echo $partes; //print_r ($partes); //é mesmo isto :) o print_r mostra os valores da array //usamos o loop FOREACH foreach ( $partes as $parte) { //populamos o armário com valores :) array_push($words, $parte); } //print_r($words); //////////////////////////////////////////////////////////////////////////////////// //teste caso tenha mais q uma palavra... // $palavrasExplode = explode ( " " , $input ); if (count($palavrasExplode) > 1) { $palavras = array (); foreach ($palavrasExplode as $palavra) { //echo ''; //echo 'palavra = '.$palavra; //echo ''; array_push( $palavras , $palavra); } maisQueUmaPalavra( $palavras , $words ); } // //fim teste caso tenha mais q uma palavra... $shortest =-1; //esta var tem de ser definida, senão..! //faz um loop com foreach para encontrar a distância mais curta foreach ($words as $word) { //aqui começa o foreach //calcula a distância entre a $input e a $word $lev = levenshtein( $input , $word ); //levenshtein ( string $str1 , string $str2 , int $cost_ins , int $cost_rep , int $cost_del ) //echo '$input = '.$input.''; //echo 'edit distance = '.$lev.''; //echo 'palavra = '.$word.''; // se existir igual, quebra o loop if ($lev == 0) { //echo '$closest = $closest'; //a palavra mais parecida é esta.. $closest = $word; $shortest = 0; //quebra o loop break; } $word_lenght = strlen($word); //echo 'word_lenght ='.$word_lenght; $input_lenght = strlen($input); //esta parte é interessante // if this distance is less than the next found shortest distance, OR if a next shortest word has not yet been found if ( $lev <= $shortest || $shortest < 0 ) { //echo 'word_lenght ='.$word_lenght.''; //echo 'input_lenght ='.$input_lenght.''; if( $word_lenght >= $input_lenght) { //echo '1'; $closest = $word; $shortest = $lev; //echo 'shortest = '.$shortest.''; //echo 'closest = '.$closest .''; } else if ( $word_lenght <= $input_lenght ) //(a palavra encontrada for maior ou igual e o $lev seja menor ou igual a 1) { //echo '2'; $closest = $word; $shortest = $lev; //echo 'shortest = '.$shortest.''; //echo 'closest = '.$closest .''; } } } //aqui acaba o for each //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// //parte q manda a info p o ecra //echo "Input word: $input"; if ($shortest == 0 && ( strlen($closest) > 2) ) { echo "Encontramos: ".$closest; } else if ( ( $shortest < 5) && ( strlen($closest) > 2) ) { //echo 'strlen closest = '.strlen($closest); echo "Será que quis dizer: $closest"; //echo 'edit distance = '.$shortest.''; //echo 'edit distance = '.$lev.''; } //////////////////////////////////////////////////////////////////////////////////// }//fim do if? yeah! //qual if? } //fim do se n houver resultado directo da BD... //echo 'aqui ainda não entrou no IF'; if ( $_GET['search']!= NULL && strlen($_GET['search'])<3 ) { echo 'o termo tem de ter pelo menos 3 caracteres'; //echo "strlen = ".strlen($_GET['search']).''; } function showSearchInput() { echo' '; } showSearchInput(); ////////////////////////////////////////////////////////////// //function caso tenha mais que uma palavra.. function maisQueUmaPalavra($asPalavras , $words) { $shortest =-1; //esta var tem de ser definida, senão..! $resultado = array(); //print_r ( $asPalavras ) ; //$conta = explode ( " " , $asPalavras ); //echo 'count = '.count ($conta).''; //por cada vez q existir um termo... foreach ( $asPalavras as $aPalavra ) { //echo ''.$aPalavra.''; //faz um loop com foreach para encontrar a distância mais curta foreach ( $words as $word ) { //aqui começa o foreach //calcula a distância entre a $input e a $word $lev = levenshtein( $aPalavra , $word ); //levenshtein ( string $str1 , string $str2 , int $cost_ins , int $cost_rep , int $cost_del ) //echo 'aPalavra = '.$aPalavra.''; //echo 'edit distance = '.$lev.''; //echo 'palavra = '.$word.''; // se existir igual, quebra o loop if ($lev == 0) { //echo '$closest = $closest'; //a palavra mais parecida é esta.. $closest = $word; $shortest = 0; //quebra o loop break; } $word_lenght = strlen($word); //echo 'word_lenght ='.$word_lenght; $input_lenght = strlen($aPalavra); //esta parte é interessante // if this distance is less than the next found shortest distance, OR if a next shortest word has not yet been found if ( $lev <= $shortest || $shortest < 0 ) { //echo 'word_lenght ='.$word_lenght.''; //echo 'input_lenght ='.$input_lenght.''; if( $word_lenght >= $input_lenght) { //echo '1'; $closest = $word; $shortest = $lev; //echo 'shortest = '.$shortest.''; //echo 'closest = '.$closest .''; } else if ( $word_lenght <= $input_lenght ) //(a palavra encontrada for maior ou igual e o $lev seja menor ou igual a 1) { //echo '2'; $closest = $word; $shortest = $lev; //echo 'shortest = '.$shortest.''; //echo 'closest = '.$closest .''; } } } array_push( $resultado , $closest ); } //////////////////////////////////////////////////////////////////////////////////// //parte q manda a info p o ecra //echo "Input word: $asPalavras"; if ($shortest == 0 && ( strlen($closest) > 2) ) { echo "Encontramos: $closest"; } else if ( ( $shortest < 5) && ( strlen($closest) > 2) ) { //print_r ( $resultado ); foreach ( $resultado as $resultados ) { $resultadoFinal .= ' '.$resultados ; } //echo 'strlen closest = '.strlen($closest); echo "Será que quis dizer: $resultadoFinal"; //echo 'edit distance = '.$shortest.''; //echo 'edit distance = '.$lev.''; } //////////////////////////////////////////////////////////////////////////////////// } //aqui acaba o caso tenha mais que uma palavra.. //////////////////////////////////////////////////////////////////////////////////// ?>