Menu
Jest wolny
rejestracja
Dom  /  Oprogramowanie układowe/ Wszystko szukaj w php s. Jak stworzyć wielowyrazowy algorytm wyszukiwania w PHP z bazy danych

Dowolne wyszukiwanie php s. Jak stworzyć wielowyrazowy algorytm wyszukiwania w PHP z bazy danych

Na początek musimy stworzyć listę plików, w której będziemy szukać żądanego słowa lub kombinacji kilku słów. W tym celu utwórzmy plik files.dat z nazwami plików do przeszukania.

Jako przykład: plik1.txt dir1/plik2.txt dir2/plik3.txt ... dirn/plik.txt

Do wyszukiwania można wykorzystać następujące funkcje: ereg i eregi oraz funkcje wyszukiwania wystąpień wyrażenia regularne oraz ich przekształcenia ereg_replace i eregi_replace. Ereg różni się od eregi tylko tym, że pierwszy wyszukuje znaki niewrażliwe na wielkość liter, podczas gdy drugi bierze je pod uwagę. Ale ponieważ będziemy szukać w tekście lub pliki html lepiej jest, abyśmy używali podświetlania wyszukiwanych słów w wyniku wyjściowym, jak wielu to robi Wyszukiwarki, a do tego wykorzystamy dwie ostatnie funkcje, tj. ereg_replace i eregi_replace.

Aby znaleźć wystąpienie słowa w łańcuchu, czyli w jaki sposób będziemy prezentować nasze pliki funkcji wyszukiwania w przyszłości, musimy skomponować poprawne wyrażenie regularne, tj. jak sprawić, by żądanie było zrozumiałe dla funkcji ereg_replace i eregi_replace. Wymaga to trochę poznania składni wyrażeń regularnych, ale możesz to zrobić w wolnym czasie, a w tym przypadku będzie to coś takiego: " \0 ", czyli tutaj użyłem tagów I aby podświetlić znalezione słowa, możesz użyć dowolnych innych tagów. W rezultacie nasza funkcja będzie na razie wyglądać tak:

// $text — tekst, w którym należy szukać // $search_text — szukaj słów // $use_register — zarejestruj użycie funkcji search($text, $search_text, $use_register=false) ( if ($use_register) // wielkość liter ( return ereg_replace($search_text," \0",$text); // szukaj, zamień, zwróć ) else // bez uwzględniania wielkości liter ( return eregi_replace($search_text," \0",$text); // wyszukaj, zamień, zwróć ) return $result; // na wszelki wypadek )

Możesz także napisać inną funkcję, która odczyta plik (może być użyta jako ścieżka URL do pliku) do ciągu:

// $url=~"http://sitename.ru nazwa pliku /"; // lub // $url=~"ftp://użytkownik: [e-mail chroniony]/filename"; //lub //$url=~" filename"; function Remote_file_read($url) ( $text=""; $file = @fopen ($url, "r"); if (!$file) ( return "-1"; echo "EROR"; //może usunąć exit; ) while (!feof ($file)) ( $line = fgets ($file, 1024); $text.=$line; ) fclose( $plik); zwróć $tekst; )

Napisaliśmy funkcję wyszukiwania, teraz pozostaje napisać kod wyszukiwania, będzie wyglądać mniej więcej tak:

$files_file="pliki.dat"; $odcięcie=100; // wytnij ciąg znaków na długość // $text — tekst do przeszukania // $search_text — wyszukaj słowa // $use_register — użyj funkcji rejestru search($text,$search_text,$use_register=false) ( if ($use_register) ( return ereg_replace($search_text," \0",$text); ) else ( return eregi_replace($search_text," \0",$text); ) return ""; ) function Remote_file_read($url) ( $text=""; [e-mail chroniony]($url, "r"); if (!$plik) ( return "READ EROR"; exit; ) while (!feof ($file)) ( $line=fgets ($file, 1024); $text.=$line; ) fclose($file) ; zwróć $tekst; ) function Cut_string($text,$search_text) // Funkcja cięcia tekstu ( global $obrezanie; $p=strpos($text, " „.$search_text”."); $p=$p-$obrezanie; if ($p<0) $p=0; $text=substr($text,$p,$obrezanie*2+strlen("„.$search_text”.")); return $text; ) // Wyświetl formularz wyszukiwania echo "

Czego szukać:

Jak szukać:

Wielkość liter ma znaczenie
Wielkość liter nie jest wrażliwa

"; if (isset($Search_text)) // Jeśli słowo wyszukiwania jest ustawione, przejdź dalej ( $found=false; if (!isset($type)) $type=1; // Sprawdź typ wyszukiwania, jeśli ( $type= =0) $use_register=true; else $use_register=false; $file=file($files_file); $count=count($file); for ($i=0 ; $i<$count ; $i++) // Проходим по всем файлам указанным в files.dat { $def_text=htmlspecialchars(Remote_file_read(trim($file[$i]))); $return_text=search($def_text,$Search_text,$use_register); if ($def_text!==$return_text) { echo "

".trim($plik[$i])."

"; echo Cut_string($return_text, $Search_text); echo "
Otwórz tę stronę"; echo "


"; } } }

Otrzymany kod możesz bez problemu wykorzystać na swojej stronie, pomimo jego prostoty, dla większości małych stron powinien wystarczyć. Główną wadą kodu jest to, że podczas wyszukiwania w plikach html wynik może nie być wyświetlany w szczególnie czytelnej formie. Dlatego ten skrypt jest przeznaczony głównie do wyszukiwania w plikach tekstowych.

Jeśli chcesz wziąć pod uwagę słowa zawarte w cudzysłowie, potrzebujesz następującego wyrażenia regularnego:

$search_expression = "niedźwiedź jabłko \"Tom Cruise\" lub "Myszka Miki" inne słowo"; $words = preg_split("/[\s,]*\\\"([^\\\"]+)\\\"[\s,]*|" . "[\s,]*"([ ^"]+)"[\s,]*|" . "[\s,]+/", $search_expression, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); print_r($słowa);

Otrzymasz pojedyncze słowa i frazy w cudzysłowie

Kilka razy byłem proszony o napisanie artykułu na temat jak zaimplementować wyszukiwanie w witrynie za pomocą php. To zadanie nie jest łatwe, powiedziałbym nawet - bardzo trudne, ponieważ istnieje ogromna liczba niuansów i przeszkód. W tym artykule przeanalizuję algorytm wyszukiwania witryn.

Załóżmy, że nasza strona zawiera wiele różnych materiałów (artykuły, aktualności, notatki itp.). Cała ta dobroć jest w bazie danych. A naszym zadaniem jest zaimplementuj wyszukiwanie w witrynie. Najprostszy algorytm jest następujący:

  1. Tworzyć formularz HTML z paskiem wyszukiwania, a także przyciskiem „ Składać". W polu tekstowym użytkownicy wprowadzą zapytanie wyszukiwania, a następnie klikną przycisk.
  2. Pobierz zapytanie wyszukiwania (zwykle przekazywane przez metodę DOSTWAĆ, ale czasami używany POCZTA), a także w celu ochrony przed XSS, przekaż to przez funkcję htmlznaki specjalne().
  3. Dokonaj wyboru z odpowiedniej tabeli (z artykułami, wiadomościami, notatkami itp.) tych rekordów, które zawierają zapytanie wyszukiwania. Pokazuję przykładowe zapytanie SQL dla takich przypadków: SELECT * FROM Articles WHERE `text_article` LIKE %search% Odpowiednio, zamiast Szukaj wyszukiwany ciąg jest zastępowany.
  4. Po otrzymaniu rekordów wyświetlamy je w wymaganej formie, najlepiej według trafności. Na przykład zrobiłem to na mojej stronie: tam, gdzie jest najwięcej dopasowań, ten artykuł jest bardziej odpowiedni, dlatego postawiłem go na pierwszym miejscu. Najprawdopodobniej ta metoda oceny trafności będzie również dla Ciebie odpowiednia.

Wielu z Was powie, że nie ma tu nic skomplikowanego. I będą częściowo rację, jednak spójrzmy na ten przykład ciągu wyszukiwania: „ szukam tego tekstu". Pojawia się pytanie:" Czego właściwie szukamy?„. Czy dokładne wystąpienie tekstu jest wyszukiwane dla „ szukam tego tekstu„. Albo może wyszukiwany jest tekst, w którym występują wszystkie trzy słowa, ale które nie mogą następować po sobie. Albo może wyszukiwany jest tekst, w którym występuje co najmniej jedno z tych słów.

I tutaj zadanie staje się znacznie bardziej skomplikowane. Możesz stworzyć złożony system składni (jak w wyszukiwarkach), na przykład dokładne dopasowanie jest wyszukiwane, jeśli zapytanie jest podane w cudzysłowie. Możesz też dać użytkownikom wybór sposobu wyszukiwania (za pomocą przycisków radiowych). W ten sposób odbywa się to na mojej stronie. Dlatego do poprzedniego algorytmu dodawany jest jeszcze jeden element: kompilowanie zapytania SQL. Oto przykład zapytania SQL, gdy trzeba wyciągnąć wszystkie materiały, które mają co najmniej jedno słowo z zapytania " szukam tego tekstu":

SELECT * FROM artykułów WHERE (`text_article` LIKE "%search%" OR `text_article` LIKE "%this%" OR `text_article` LIKE "%text%")

W związku z tym w skrypcie wyszukiwania powinieneś wygenerować podobne Zapytania SQL, wyślij do bazy danych, odbierz odpowiedź i wyślij ją. Staje się to jeszcze bardziej skomplikowane, jeśli wyświetlasz posty według trafności, ponieważ trudno od razu określić, który z nich powinien być bardziej odpowiedni: 3 dokładne dopasowanie do żądania lub 10 wystąpienia części zapytania. Na mojej stronie preferowane są zawsze dokładne zdarzenia, ale ten punkt jest już dość kontrowersyjny. Oczywiście jest to trudne, a jeśli robisz to po raz pierwszy, na pewno spędzisz kilka godzin. Mam nadzieję, że mój algorytm realizacji wyszukiwania w serwisie przez PHP Pomoże Ci.

(PHP 4 >= 4.0.5, PHP 5)

array_search -- Wykonuje wyszukiwanie podana wartość w tablicy i zwraca odpowiedni klucz, jeśli się powiedzie

Opis

mieszany wyszukiwanie_tablicy(mieszana igła, tablica stóg siana [, bool strict])

Przeszukuje stog siana w poszukiwaniu igły i zwraca klucz, jeśli istnieje, w tablicy, FAŁSZYWE Inaczej.

Komentarz: Jeśli igła jest ciągiem, dokonywane jest porównanie z uwzględnieniem wielkości liter.

Komentarz: Przed PHP 4.2.0, wyszukiwanie_tablicy() zwrócony w przypadku awarii ZERO zamiast FAŁSZYWE .

Jeśli przekażesz wartość PRAWDA jako opcjonalny trzeci parametr do strict , funkcja wyszukiwanie_tablicy() sprawdzi również rodzaj igły w tablicy stogu siana.

Jeśli igła jest obecna w stogu siana więcej niż jeden raz, zwrócony zostanie pierwszy znaleziony klucz. Aby zwrócić klucze dla wszystkich znalezionych wartości, użyj funkcji klucze_tablicy() z opcjonalnym parametrem search_value .


Przykład 1: Przykład użycia wyszukiwanie_tablicy()

$array = array(0 => "niebieski" , ​​1 => "czerwony" , 2 => 0x000000 , 3 => "zielony" , 4 => "czerwony" );$key = array_search ("czerwony" , $tablica ); // $klucz = 1;
$klucz = array_search("zielony" , $tablica ); // $klucz = 2; (0x000000 == 0 == "zielony")
$klucz = array_search ("zielony" , $tablica , prawda ); // $klucz = 3;
?>
Uwaga

Ta funkcja może zostać zwrócona jako wartość logiczna FAŁSZYWE, oraz wartość inną niż logiczna, która jest rzutowana na FAŁSZYWE, na przykład 0 lub „”. Więcej dokładna informacja patrz rozdział Typ Boole'a. Użyj operatora ===, aby przetestować wartość zwracaną przez tę funkcję.

Najlepszym sposobem na zatrzymanie użytkownika na stronie jest umożliwienie mu znalezienia tego, czego szuka. Jeśli to zrobisz wygodny system, wtedy poziom preferencji dla Twojej witryny wzrośnie i użytkownik na pewno wróci, aby znaleźć to, co go interesuje.

Pokażę Ci jak stworzyć prosty, ale funkcjonalny formularz wyszukiwania, który posłuży do wyszukiwania artykułów w serwisie. Wyniki pojawią się na stronie bez żadnych przeładowań, co niewątpliwie jest Najlepszym sposobem składanie informacji.

Stworzę 2 pliki: search.php, które będą zawierały HTML i JavaScript. Drugi plik, do_search.php, będzie zawierał kod PHP. Zacznijmy tworzyć pierwszy plik:

Demo wyszukiwania PHP, jQuery

Spróbuj wpisać słowo ajax


wyniki dla

W tym pliku stworzyliśmy zwykłe formularz HTML, który wysyła żądanie POST do pliku do_search.php zaplecza.

select_list($sql); if(count($row)) ( $end_result = ""; foreach($row as $r) ( $result = $r["title"]; $bold = " " . $słowo . ""; $end_result .= "

  • " .str_ireplace($słowo, $pogrubienie, $wynik) . "
  • "; ) echo $end_result; ) else ( echo "
  • Nic nie znaleziono dla twojej prośby
  • "; } } ?>

    Kod PHP zawiera komentarze, które ułatwiają zrozumienie działania skryptu. Jeśli w bazie danych znajdują się dopasowania, pokazujesz je swojemu użytkownikowi, pogrubiając słowa, których szukał.

    Dodajmy do tego trochę CSS:

    Body( rodzina czcionek:Arial, Helvetica, sans-serif; ) *( margines:0;padding:0; ) #container ( margines: 0 auto; szerokość: 600px; ) a ( kolor:#DF3D82; dekoracja tekstu: none ) a:hover ( color:#DF3D82; text-decoration:underline; ) ul.update ( list-style:none;font-size:1.1em; margin-top:10px ) ul.update li( height:30px; border-bottom:#dedede solid 1px; text-align:left;) ul.update li:first-child( border-top:#dedede solid 1px; height:30px; text-align:left; ) #flash ( margin- top:20px; text-align:left; ) #searchresults ( text-align:left; margin-top:20px; display:none; font-family:Arial, Helvetica, sans-serif; font-size:16px; color: #000; ) .word ( font-weight:bold; color:#000000; ) #search_box ( padding:4px; border:solid 1px #666666; width:300px; height:30px; font-size:18px;-moz- border-radius: 6px;-webkit-border-radius: 6px; ) .search_button ( border:#000000 solid 1px; padding: 6px; color:#000; font-weight:bold; font-size:16px;-moz- border-radius: 6px;-webkit-border-radius: 6px; .found ( font-weight: bold ; styl czcionki: kursywa; kolor: #ff0000; ) h2 ( margines prawy: 70px; )

    Nauczyłeś się więc, jak stworzyć prosty formularz wyszukiwania, który działa bez przeładowywania strony. Mam nadzieję, że lekcja się podobała.