Menü
Bedava
kayıt
ev  /  bellenim/ Herhangi bir arama php s. Bir veritabanından PHP'de birden çok kelime için bir arama algoritması nasıl yapılır

Herhangi bir arama php s. Bir veritabanından PHP'de birden çok kelime için bir arama algoritması nasıl yapılır

İlk olarak, istenen kelimeyi veya birkaç kelimenin bir kombinasyonunu arayacağımız bir dosya listesi oluşturmamız gerekiyor. Bunu yapmak için, aramanın gerçekleştirileceği dosyaların adlarıyla bir files.dat dosyası oluşturun.

Örnek olarak: dosya1.txt dizin1 / dosya2.txt dizin2 / dosya3.txt ... dizin / dosyan.txt

Arama yapmak için aşağıdaki işlevleri kullanabilirsiniz: ereg ve eregi ve ayrıca olaylar için arama işlevleri düzenli ifadeler ve bunların dönüşümleri ereg_replace ve eregi_replace. Ereg'in eregi'den farkı, yalnızca ilkinin vakayı duyarsız bir şekilde araması ve ikincisinin onları hesaba katmasıdır. Ancak metinde arama yapacağımızdan veya html dosyalarıçoğumuzun yaptığı gibi, çıktıda arama kelimelerinin vurgulanmasını kullanmamız tercih edilir. arama motorları, ve bunun için son iki işlevi kullanacağız, yani. ereg_replace ve eregi_replace.

Bir dizgede bir kelimenin oluşumunu bulmak için, bu şekilde dosyalarımızı arama fonksiyonuna daha fazla sunacağız, doğru düzenli ifadeyi oluşturmamız gerekiyor, yani. sorgunun ereg_replace ve eregi_replace işlevleri için nasıl anlaşılır olacağı. Bunu yapmak için, normal ifadelerin sözdizimini biraz çalışmanız gerekir, ancak bunu boş zamanlarınızda yapabilirsiniz ve bu durumda şöyle bir şey olacaktır: " \0 ", yani burada etiketleri kullandım ve bulunan kelimeleri vurgulamak için diğer etiketleri kullanabilirsiniz. Sonuç olarak, fonksiyonumuz şimdilik şöyle görünecek:

// $ metin - içinde aradığımız metin // $ search_text - kelimeleri ara // $ use_register - kullanım durumu işlevi arama ($ metin, $ search_text, $ use_register = false) (if ($ use_register) // if case- hassas (dönüş ereg_replace ($ search_text, " \0", $ text); // ara, değiştir, dön) else // büyük/küçük harfe duyarlı değilse (dönüş eregi_replace ($ search_text," \0", $ metin); // ara, değiştir, dön) $ sonuç döndür; // her ihtimale karşı)

Dosyayı okumak için başka bir işlev de yazabilirsiniz (bunu dosyanın URL yolu olarak kullanabilirsiniz) satıra:

// $ url = ~ "http://siteadı.ru dosyaadı /"; // veya // $ url = ~ "ftp: // kullanıcı: [e-posta korumalı]/ dosyaadı "; // veya // $ url = ~" dosyaadı "; function Remote_file_read ($ url) ($ text =" "; $ file = @fopen ($ url," r "); if (! $ file) (return "-1"; echo "EROR"; // çıkışı silebilirsiniz;) while (! feof ($ dosya)) ($ satır = fgets ($ dosya, 1024); $ metin. = $ satır;) fclose ( $ dosyası); $ metni döndür;)

Arama fonksiyonunu yazdık, şimdi arama kodunu yazmaya devam ediyor, şöyle görünecek:

$ files_file = "files.dat"; $ obrezanie = 100; // dizeyi uzunluğa göre kırpmak // $ metin - içinde aradığımız metin // $ search_text - arama sözcükleri // $ use_register - büyük/küçük harf işlevini kullanarak arama ($ metin, $ search_text, $ use_register = false) (if ($ use_register) ( ereg_replace döndür ($ search_text, " \0", $ text);) else (dönüş eregi_replace ($ search_text," \0", $ metin);) dönüş" ";) işlevi Remote_file_read ($ url) ($ metin =" "; [e-posta korumalı]($url, "r"); if (! $ dosya) (dönüş "HATA OKU"; çıkış;) while (! feof ($ dosya)) ($ satır = fgets ($ dosya, 1024); $ metin. = $ satır;) fclose ($ dosya) ; $ metin döndür; ) işlevi Cut_string ($ metin, $ search_text) // Metin kesme işlevi (global $ obrezanie; $ p = strpos ($ metin, " ". $ arama_metni.""); $ p = $ p- $ obrezanie; ise ($ p<0) $p=0; $text=substr($text,$p,$obrezanie*2+strlen("". $ arama_metni."")); $ metin döndür;) // Arama formu yankısını göster"

Ne aranmalı:

Nasıl aranır:

Harfe duyarlı
Büyük/küçük harfe duyarsız

"; if (isset ($ Search_text)) // Arama kelimesi belirtilmişse, devam edin ($ bulundu = yanlış; if (! isset ($ tipi)) $ tipi = 1; // Arama tipini kontrol edin if ( $ type = = 0) $ use_register = true; yoksa $ use_register = false; $ dosya = dosya ($ files_file); $ sayı = sayı ($ dosya); 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 ($ dosyası [$ i])."

"; echo Cut_string ($ dönüş_metni, $ Arama_metni); yankı"
Bu sayfayı aç "; yankı"


"; } } }

Ortaya çıkan kodu sitenizde sorunsuz bir şekilde kullanabilirsiniz, basitliğine rağmen çoğu küçük site için yeterli olacaktır. Kodun ana dezavantajı, html dosyalarında arama yaparken sonucun özellikle okunabilir bir biçimde görüntülenememesidir. Bu nedenle, bu komut dosyası esas olarak metin dosyalarını aramak için tasarlanmıştır.

Tırnak içine alınmış kelimeleri dikkate almak istiyorsanız, bunun gibi bir normal ifadeye ihtiyacınız vardır:

$ search_expression = "elma ayısı \" Tom Cruise \ "veya" Mickey Mouse "başka bir kelime"; $ kelimeler = preg_split ("/ [\ s,] * \\\" ([^ \\\ "] +) \\\" [\ s,] * | "." [\ s,] * "([ ^ "] +)" [\ s,] * | "." [\ s,] + / ", $ search_expression, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); print_r ($ kelime);

Tek tek kelimeleri ve cümleleri tırnak içinde alacaksınız

Zaten birkaç kez hakkında bir makale yazmam istendi. PHP ile site araması nasıl yapılır... Bu kolay bir iş değil, hatta çok zor diyebilirim, çünkü burada çok sayıda nüans ve engel var. Bu yazıda analiz edeceğim site arama algoritması.

Diyelim ki sitemizde birçok farklı materyal var (makaleler, haberler, notlar vb.). Bütün bunlar veritabanında. Ve görevimiz sitede bir arama uygula... En basit algoritma aşağıdaki gibidir:

  1. Oluşturmak HTML formu bir arama çubuğu ve bir düğme ile " Göndermek". Metin kutusuna kullanıcılar bir arama sorgusu girecek ve ardından düğmesine tıklayacaktır.
  2. Bir arama sorgusu alın (genellikle yöntemle gönderilir) ELDE ETMEK, ama bazen de kullanırlar İLETİ) ve ayrıca, karşı korumak için XSS, fonksiyondan geçir htmlözel karakterler ().
  3. Arama sorgusunu içeren kayıtların ilgili tablolarından (makaleler, haberler, notlar vb. ile) bir seçim yapın. Bu tür durumlar için örnek bir SQL sorgusu gösteriyorum: SELECT * FROM makaleler WHERE `text_article` LIKE% search% Buna göre, bunun yerine arama arama dizesi değiştirilir.
  4. Kayıtları aldıktan sonra, tercihen alaka düzeyine göre istenen biçimde görüntüleriz. Örneğin, sitemde şöyle yaptım: en çok rastlantıların olduğu yerde - bu makale daha alakalı, bu yüzden ilk sıraya koydum. Büyük olasılıkla, bu alaka düzeyini değerlendirme yöntemi sizin için de uygundur.

Birçoğunuz burada karmaşık bir şey olmadığını söyleyeceksiniz. Ve kısmen haklı olacaklar, ancak şu arama dizesi örneğine bakalım: " bu metni arıyorum". Soru:" Ve aslında ne aranıyor?". Ya metnin tam eşleşmesi aranıyor" bu metni arıyorum Ya da belki üç kelimenin de bulunduğu fakat birbirini takip etmeyen bir metin arıyorsunuz. Ya da belki bu kelimelerden en az birinin bulunduğu bir metin arıyorsunuz.

Ve burada görev çok daha karmaşık hale geliyor. Karmaşık bir sözdizimi sistemi yapabilirsiniz (arama motorlarında olduğu gibi), örneğin sorgu tırnak içinde belirtilmişse tam bir eşleşme aranır. Veya kullanıcılara nasıl arama yapmak istedikleri konusunda bir seçenek sunabilirsiniz (radyo düğmelerini kullanarak). Böylece web sitemde yapılır. Bu nedenle, önceki algoritmaya bir öğe daha eklenir: SQL sorgusu oluşturma... İşte sorgudan en az bir kelime bulunan tüm malzemeleri çıkarmanız gerektiğinde bir SQL sorgusu örneği " bu metni arıyorum":

* NEREDEKİ makalelerden (`metin_makale` GİBİ"% "VEYA` metin_makale` GİBİ "% bu%" VEYA `metin_makale` GİBİ"% metin% " arıyor)

Buna göre, arama komut dosyasında benzer oluşturmalısınız SQL sorguları, veritabanına gönderin, yanıtı alın ve çıktısını alın. Hangisinin daha alakalı olması gerektiğini hemen söylemek zor olduğundan, gönderileri alaka düzeyine göre görüntülüyorsanız bu daha da karmaşıktır: 3 sorgunun kesin oluşumları veya 10 isteğin bölümlerinin oluşumları. Benim sitemde her zaman kesin olaylar tercih edilir, ancak bu nokta zaten oldukça tartışmalıdır. Tabii ki, zor ve ilk kez yapıyorsanız, kesinlikle birkaç saat harcarsınız. umut benim PHP aracılığıyla sitede arama yapmak için algoritma Sana yardım edeceğim.

(PHP 4> = 4.0.5, PHP 5)

array_search - Aramalar verilen değer bir dizide ve başarı durumunda karşılık gelen anahtarı döndürür

Açıklama

karışık dizi_arama(karışık iğne, samanlık dizisi [, bool strict])

Samanlıkta iğne arar ve dizide varsa anahtarı döndürür, YANLIŞ aksi halde.

Yorum Yap:İğne bir dize ise, büyük/küçük harfe duyarlı bir karşılaştırma yapılır.

Yorum Yap: PHP 4.2.0'dan önce, dizi_arama () başarısızlık üzerine döndü BOŞ onun yerine YANLIŞ .

değeri geçersen NS isteğe bağlı bir üçüncü parametre katı olarak, işlev dizi_arama () ayrıca samanlık dizisindeki iğne türünü de kontrol eder.

Samanlıkta iğne birden fazla görünürse, bulunan ilk anahtar döndürülür. Bulunan tüm değerlerin anahtarlarını döndürmek için işlevi kullanın dizi_anahtarları () isteğe bağlı bir parametre arama_değeri ile.


Örnek 1. Kullanım örneği dizi_arama ()

$ dizi = dizi (0 => "mavi", 1 => "kırmızı", 2 => 0x000000, 3 => "yeşil", 4 => "kırmızı"); $ anahtar = dizi_arama ("kırmızı", $ dizi ); // $ anahtar = 1;
$ anahtar = dizi_arama ("yeşil", $ dizi); // $ anahtar = 2; (0x000000 == 0 == "yeşil")
$ anahtar = dizi_arama ("yeşil", $ dizi, doğru); // $ anahtar = 3;
?>
Dikkat

Bu işlev boolean olarak dönebilir YANLIŞ, ve için kullanılan boole olmayan bir değer YANLIŞ, örneğin 0 veya "". Daha fazlası için detaylı bilgi Boole Türü bölümüne bakın. Bu işlevin dönüş değerini test etmek için === operatörünü kullanın.

Bir kullanıcıyı bir sitede tutmanın en iyi yolu, aradıklarını bulmalarına izin vermektir. Bunun için uygun bir sistem yaparsanız, sitenizin tercih seviyesi artacak ve kullanıcı, ilgisini çeken şeyi bulmak için kesinlikle geri dönecektir.

Size sitedeki makaleleri aramak için kullanılacak basit ama işlevsel olarak etkili bir arama formunun nasıl oluşturulacağını göstereceğim. Sonuçlar, herhangi bir yeniden yükleme olmadan sayfada görünecek, ki bu şüphesiz en iyi yol bilgilerin sunulması.

2 dosya oluşturacağım: HTML ve JavaScript içeren search.php. İkinci dosya, do_search.php, PHP kodunu içerecektir. İlk dosyayı oluşturmaya başlayalım:

PHP, jQuery arama demosu

ajax kelimesini yazmayı deneyin


için sonuçlar

Bu dosyada düzenli bir HTML formu bu, do_search.php arka uç dosyasına bir POST isteği gönderir.

select_list ($ sql); if (count ($ satır)) ($ end_result = ""; foreach ($ satır olarak $ r) ($ sonuç = $ r ["başlık"]; $ kalın = " ".$ kelime.""; $ end_sonuç. ="

  • ". str_ireplace ($ kelime, $ kalın, $ sonuç)."
  • ";) echo $ end_result;) else (echo"
  • Aramanız için hiçbir sonuç bulunamadı.
  • "; } } ?>

    PHP kodu, komut dosyasının nasıl çalıştığını kolayca anlayabileceğiniz yorumları içerir. Veritabanında eşleşmeler varsa, bunları kullanıcının aradığı kelimeleri kalın harflerle vurgulayarak kullanıcınıza gösterirsiniz.

    Hepsine biraz CSS verelim:

    Gövde (yazı tipi ailesi: Arial, Helvetica, sans-serif;) * (kenar boşluğu: 0; dolgu: 0;) #container (kenar boşluğu: 0 otomatik; genişlik: 600 piksel;) a (renk: # DF3D82; metin dekorasyonu: yok) a: üzerine gelin (renk: # DF3D82; metin dekorasyonu: altı çizili;) ul.update (liste stili: yok; yazı tipi boyutu: 1.1em; kenar boşluğu: 10 piksel) ul.update li (yükseklik: 30 piksel; border-bottom: #dedede solid 1px; text-align: left;) ul.update li: first-child (border-top: #dedede solid 1px; height: 30px; text-align: sol;) #flash (kenar- üst: 20 piksel; metin hizalama: sol;) #searchresults (metin hizalama: sol; kenar boşluğu üst: 20 piksel; görüntü: yok; yazı tipi ailesi: Arial, Helvetica, sans-serif; yazı tipi boyutu: 16 piksel; renk: # 000;) .word (yazı tipi ağırlığı: kalın; renk: # 000000;) #search_box (dolgu: 4 piksel; kenarlık: düz 1 piksel # 666666; genişlik: 300 piksel; yükseklik: 30 piksel; yazı tipi boyutu: 18 piksel; -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 (yazı tipi-ağırlığı: kalın ; yazı tipi stili: italik; renk: # ff0000; ) h2 (sağ kenar boşluğu: 70px;)

    Artık sayfayı yeniden yüklemeden çalışan basit bir arama formunu nasıl oluşturacağınızı öğrendiniz. Umarım öğreticiden keyif almışsınızdır.