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 "
"; 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:
- 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.
- 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().
- 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.
- 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()
|
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:
Spróbuj wpisać słowo ajax
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 .= "
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.