şablon
Site arama sonuçlarının görüntüleneceği şablonun adı. XSLT şablon motorunda yoksayılır.
Arama dizisi
Arama ifadesi. Değer ayarlanmazsa, arama formundan iletilen istekten alınır.
search_types
Arama için hiyerarşik tür tanımlayıcılarının listesi (boşlukla belirtilir). Değer belirtilmemişse tüm türler aranır.
arama_dalları
Aramanın gerçekleştirileceği bölümlerin listesi (bir boşlukla gösterilir). Değer belirtilmemişse tüm bölümler aranır. Parametre hem sayfa kimliklerini hem de URL'lerini alabilir.
Sayfa başına
Sayfa başına sonuç sayısı. Parametre ayarlanmazsa "Arama" modülü ayarlarında belirtilen değer alınacaktır.
%Toplam%Akıştaki toplam haber sayısını görüntüler. Makro için kullanılabilir %sistem sayıları()%.
%Sayfa başına%sayfa başına parametrenin değerini görüntüler. Makro için kullanılabilir %sistem sayıları()%.
%list-class-first%öğenin ilk olması durumunda, "ilk" görüntüler
%list-class-last%öğenin son olması durumunda, "son" görüntüler
%list-sınıfı-tek%öğenin çift olması durumunda "tek" görüntüler
%list-class-even%öğenin tek olması durumunda "çift" görüntüler
%list-konumu%listeye bir seri numarası ekler
search_empty_result
Arama sonucunda hiçbir sayfa bulunamadığında kullanılır. Bu durumda, blok yerine bu blok görüntülenir. search_block .
%last_search_string%
Varsa, önceki arama sorgusunu görüntüler.
search_block_line_quant
Arama sonuçları arasına eklenen bir ayırıcının çıktısını verir.
kullanım örnekleri
%toplam% sayfa bulundu.%lines%%system numpages(%total%, %per_page%)%
SON; $FORMS["search_block_line" ] =<<Düzenli ifadeler, geliştiriciler için çok kullanışlı bir araçtır. Onların yardımıyla metin, kelime veya diğer karakterleri bulabilir, tanımlayabilir veya değiştirebilirsiniz. Bugünün makalesi, herhangi bir web geliştiricisinin ihtiyaç duyacağı en kullanışlı 15 düzenli ifadeyi içeriyor.
Normal ifadelere giriş
Birçok acemi geliştirici, normal ifadeleri anlamak ve kullanmak için çok zor buluyor. Aslında her şey göründüğü kadar zor değil. Kullanışlı ve çok yönlü kodlarıyla doğrudan düzenli ifadelere geçmeden önce, temel bilgilere bir göz atalım:
Normal İfade Sözdizimi
Düzenli ifade | Anlamına geliyor |
ahmak | "foo" dizisi |
^foo | Dize "foo" ile başlar |
foo$ | Dize "foo" ile biter |
^fo$ | "foo" bir satırda yalnızca bir kez oluşur |
a, b veya c | |
herhangi bir küçük harf | |
[^A-Z] | büyük harf olmayan herhangi bir karakter |
(gif|jpg) | Hem "gif" hem de "jpeg" anlamına gelir |
+ | Bir veya daha fazla küçük harf |
Herhangi bir sayı, nokta veya eksi işareti | |
^{1,}$ | Herhangi bir kelime, en az bir harf, sayı veya _ |
()() | wy, wz, xy veya xz |
(^A-Za-z0-9) | Herhangi bir karakter (sayı veya harf değil) |
({3}|{4}) | Üç harf veya 4 rakam anlamına gelir |
Normal İfadeler için PHP İşlevleri
İşlev | Tanım |
preg_match() | preg_match() işlevi, belirli bir desene göre bir dize arar, dize bulunursa true, aksi takdirde false döndürür |
preg_match_all() | preg_match_all() işlevi, bir model tarafından verilen bir dizenin tüm oluşumlarını bulur |
preg_replace() | preg_replace() işlevi, ereg_replace() işleviyle aynı şekilde çalışır, ancak normal ifadelerin hem arama modelini hem de bulunan değeri değiştirecek dizeyi belirtmek için kullanılabilmesi dışında. |
preg_split() | preg_split() işlevi, normal bir ifadenin bir arama modeli için parametre olarak kullanılabilmesi dışında split() ile aynıdır. |
preg_grep() | preg_grep() işlevi, giriş dizisinin tüm öğelerini arar ve normal ifade modeliyle eşleşen tüm öğeleri döndürür. |
preg_quote() | Normal ifade karakterlerinden kaçar |
Alan adı doğrulama
Bir dizenin geçerli bir alan adı olup olmadığını kontrol etme
$url = "http://komunitasweb.com/"; if (preg_match("/^(http|https|ftp)://(*(?:.*)+):?(d+)?/?/i", $url)) ( echo "URL'niz uygun ."; ) else ( echo "Yanlış url."; )
Metinde kelime vurgulama
Bu çok kullanışlı bir normal ifadedir, doğru kelimeyi bulmak ve onu vurgulamak için kullanabilirsiniz. Özellikle arama sonuçlarını görüntülemek için kullanışlıdır.
$text = "KomunitasWeb'den örnek cümle, regex web programlamada popüler hale geldi. Artık regex öğreniyoruz. Wikipedia'ya göre, Düzenli ifadeler (regex veya regexp olarak kısaltılır, çoğul formları regex, regexps veya regexen) resmi bir şekilde yazılır. bir normal ifade işlemcisi tarafından yorumlanabilen dil"; $metin = preg_replace("/b(regex)b/i", " 1", $metin); eko $metin;
Bir WordPress Blogunda Arama Sonuçlarını Vurgulama
Önceki örnekte bahsedildiği gibi, bu kod örneği arama sonuçlarında kullanışlıdır ve bu özelliği bir wordpress blogunda uygulamanın harika bir yolu vardır.
search.php dosyanızı açın ve the_title() işlevini bulun. Aşağıdaki kodla değiştirin:
yankı $başlık;
Şimdi, bu satırın üstüne şu kodu ekleyin:
\0", $başlık); ?>
search.php dosyasını kaydedin ve style.css dosyasını açın. Aşağıdaki satırı ekleyin:
Strong.search-alıntı ( arka plan: sarı; )
Bir HTML belgesinden tüm görüntüleri alma
Bir web sayfasından tüm resimleri almanız gerekiyorsa, bu kod, cURL özelliklerini kullanarak kolayca bir resim yükleyici oluşturabilmeniz gerekir.
$resim = dizi(); preg_match_all("/(img|src)=("|\")[^"\">]+/i", $veri, $medya); unset($veri); $veri = preg_replace("/(img|src)("|\"|="|=\")(.*)/i", "$3", $medya); foreach ($veri olarak $url) ( $info = pathinfo($url); if (isset($info["extension"])) ( if (($info["extension"] == "jpg") || ($info["uzantı"] == "jpeg") || ($info["uzantı"] == "gif") || ($info["uzantı"] == "png")) array_push($ resimler, $url); ))
Yinelenen kelimeleri kaldırın (büyük/küçük harfe duyarlı değil)
Yazarken kelimeleri sık sık tekrarlıyor musunuz? Bu normal ifade yardımcı olacaktır.
$metin = preg_replace("/s(w+s)1/i", "$1", $metin);
Tekrarlanan noktalama işaretlerini kaldırma
Aynı, sadece noktalama işaretleri için. Çift virgülle vedalaşın.
$metin = preg_replace("/.+/i", ".", $metin);
XML/HTML etiketlerini arayın
Bu basit fonksiyon iki argüman alır. Birincisi bulmanız gereken etiket, ikincisi ise XML veya HTML'yi içeren değişkendir. Yine, bu işlevin cURL ile kullanılması çok uygundur.
işlev get_tag($tag, $xml) ( $tag = preg_quote($tag); preg_match_all("(<".$tag."[^>]*>(.*?)".$tag.">.")", $xml, $eşleşir, PREG_PATTERN_ORDER); $eşleşmeleri döndür; )
Belirli bir öznitelik değerine sahip XHTML/XML etiketlerini arayın
Bu işlev, etikete istediğiniz özniteliği ayarlayabilmeniz dışında, öncekine çok benzer. Örneğin, kolayca bulabilirsiniz
function get_tag($attr, $value, $xml, $tag=null) ( if(is_null($tag)) $tag = "\w+"; else $tag = preg_quote($tag); $attr = preg_quote($ attr); $değer = preg_quote($değer); $tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*". "(["\"])$değer\\2[^>]*>(.*?)<\/\\1>/" preg_match_all($tag_regex, $xml, $eşleşmeler, PREG_PATTERN_ORDER); dönüş $eşleşmeler; )
Onaltılık Renk Değerlerini Bul
Bir web geliştiricisi için başka bir faydalı araç! Bir rengin onaltılık değerini bulmanızı/kontrol etmenizi sağlar.
$dizi = "#555555"; if (preg_match("/^#(?:(?:(3))(1,2))$/i", $string)) ( echo "örnek 6 başarılı."; )
Makale başlığı arama
Bu kod parçası, etiketlerin içindeki metni bulur ve görüntüler.
$fp = fopen("http://www.catswhocode.com/blog","r"); while (!feof($fp))( $sayfa .= fgets($fp, 4096); ) $titre = eregi("
Apache günlük ayrıştırma
Çoğu site, iyi bilinen Apache web sunucusunda çalışır. Siteniz bunlardan biriyse, Apache günlüklerini ayrıştırmak için neden PHP ve normal ifadeleri kullanmıyorsunuz?
//Günlükler: Apache web sunucusu //Yalnızca HTML dosyalarına yönelik başarılı isabetler. Sayfa görüntüleme sayısını saymak için kullanışlıdır. "^((?#client IP veya alan adı)S+)s+((?#temel kimlik doğrulama)S+s+S+)s+[((?#tarih ve saat)[^]]+)]s+"(?: GET|POST|HEAD) ((?#file)/[^ ?]+?.html?)??((?#parameters)[^ ?]+)? HTTP/+"s+(?#status code)200s+((?#byte aktarıldı)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent) )[^"]*)"$" //Günlükler: Yalnızca Apache web sunucusu ////404 hataları "^((?#client IP veya alan adı)S+)s+((?#temel kimlik doğrulama)S+s+S+) s+[((?#tarih ve saat)[^]]+)]s+"(?:GET|POST|HEAD) ((?#dosya)[^ ?]+)??((?#parameters)[ ^ ?"]+)? HTTP/+"s+(?#status code)404s+((?#byte aktarıldı)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent) )[^"]*)"$"
Çift tırnakları akıllı tırnaklarla değiştirme
Bir tipografi aşığıysanız, normal çift tırnakları akıllı tırnaklarla değiştiren bu düzenli ifadeyi seveceksiniz. Sayfa içeriğinde wordpress'te benzer bir normal ifade kullanılır.
Preg_replace("B"b([^"x84x93x94rn]+)b"B", "?1?", $metin);
Kapsamlı şifre kontrolü
Bu normal ifade, metin alanına en az altı karakter, sayı, kısa çizgi ve alt çizgi girilmesini sağlayacaktır.
Metin alanı en az bir büyük harf, bir küçük harf ve bir sayı içermelidir.
"A(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?) [-_a-zA-Z0-9](6,)z"
WordPress: Bir gönderiden resim almak için normal bir ifade kullanma
Birçoğunuz WordPress kullanıcısı olduğunuz için, bir makalenin metninden tüm görüntüleri almanıza ve çıktısını almanıza izin veren bir koda sahip olmanız yararlı olabilir.
Bu kodu kullanmak için temanızdaki herhangi bir dosyaya yapıştırmanız yeterlidir.
Mesaj İçeriği; $szSearchPattern = "~ ]* />~"; // Tüm görüntüleri almak ve sonuçları $aPics'e kaydetmek için preg_match_all komutunu çalıştırın preg_match_all($szSearchPattern, $szPostContent, $aPics); // En az 1 resmimiz olup olmadığını kontrol edin $iNumberOfPics = count($aPics); if ($iNumberOfPics > 0) ( // Şimdi burada resimlerle ne yapmanız gerekiyorsa yapacaksınız // Bu örnekte resimler sadece ($i=0; $i) için gösteriliyor< $iNumberOfPics ; $i++) { echo $aPics[$i]; }; }; endwhile; endif; ?>
Otomatik ifadelerin oluşturulması
Wordpress'te kullanılan bir diğer özellik de, gülen yüz sembollerini otomatik olarak bir gülen yüz görüntüsü ile değiştirmenize izin vermesidir.
$texte="Suratlı bir metin :-)"; echo str_replace(":-)"," ",$metin);
Bir kullanıcıyı sitede tutmanın en iyi yolu, aradığını bulması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 bir arama formunun nasıl oluşturulacağını göstereceğim. Sonuçlar, hiç şüphesiz bilgileri sunmanın en iyi yolu olan herhangi bir yeniden yükleme olmadan sayfada görünecektir.
2 dosya oluşturacağım: HTML ve JavaScript içeren search.php. İkinci dosya olan do_search.php PHP kodunu içerecektir. İlk dosyayı oluşturmaya başlayalım:
ajax kelimesini girmeyi deneyin
Bu dosyada, arka uca bir POST isteği gönderen normal bir HTML formu oluşturduk, do_search.php dosyası.
select_list($sql); if(count($satır)) ( $end_result = ""; foreach($satır olarak $r) ( $sonuç = $r["başlık"]; $bold = " ".$kelime.""; $end_result .="
PHP kodu, betiğin nasıl çalıştığını anlamanızı kolaylaştıran yorumlar içerir. Veritabanında eşleşmeler varsa, kullanıcının aradığı kelimeleri kalınlaştırarak bunları kullanıcınıza gösterirsiniz.
Hepsine biraz CSS verelim:
Gövde( font-family:Arial, Helvetica, sans-serif; ) *( margin:0;padding:0; ) #container ( margin: 0 auto; width: 600px; ) a ( color:#DF3D82; text-decoration: yok ) 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; renk: #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-ağırlığı: kalın ; yazı tipi stili: italik; renk: #ff0000; ) h2 (sağ kenar boşluğu: 70px; )
Böylece, sayfayı yeniden yüklemeden çalışan basit bir arama formunu nasıl oluşturacağınızı öğrendiniz. Umarım dersten hoşlanmışsınızdır.
İle İbrahim Diallo
2 Temmuz 2014 tarihinde yayınlandı ~ 16 dakika okumaArama, bir web sitesinde önemli bir özelliktir. Birkaç okuyucum blogumda belirli bir pasaj aramak istediğinde, arama kutusunu kullanırlar. Eskiden Google Arama tarafından destekleniyordu, ancak o zamandan beri daha iyisini yapabileceğim için değil, ilginç bir meydan okuma olduğu için kendi ev yapımı sürümüme değiştirdim.
Aceleniz varsa ve sadece sitenizin aranabilir olmasını istiyorsanız, daha önce yaptığımı yapın, Google'ı kullanın.
// search.php dosyasında $term = isset($_GET["query"])?$_GET["query"]: ""; $terim = urlencode($terim); $website = urlencode("www.yourwebsite.com"); $redirect = "https://www.google.com/search?q=site%3A($website)+($term)"; header("Yer: $yönlendirme"); çıkış;
Yaptığı şey oldukça basit. Kullanıcı tarafından geçen terimi alın ve Google arama sayfasına iletin. Arama sorgusunda site: anahtar sözcüğünü kullanarak arama sonucunu mevcut alanımızla sınırlayın. Google tarafından dizine eklenen tüm sayfalarınız artık arama yoluyla erişilebilir olacak. Ancak aramanızı evde halletmek istiyorsanız, okumaya devam edin.
Ev Yapımı Arama Çözümü
Daha ileri gitmeden önce, bu blogdaki arama kutusunu kullanmayı deneyin. Aşağıda tarif edeceğim işlemin aynısını kullanıyor. İstediğinizin bu olduğunu düşünüyorsanız, lütfen okumaya devam edin.
Bu çözüm, küçük web sitelerine yöneliktir. LIKE'ı her iki uçta da joker karakterlerle kullanıyorum, yani aramanız dizine eklenemez. Bu, çözümün tonlarca veri içermeyen blogunuz veya kişisel web siteniz için iyi çalışacağı anlamına gelir.Bunu daha büyük bir web sitesine taşıyın ve çok yavaş olabilir.MySQL, burada yapmadığımız Tam Metin Arama özelliğini sunar.
Not: 5000 blog yayınınız varsa, hala iyisiniz. .
Bu blogun yapısını referans olarak alacağız. Her blog gönderisinde şunlar bulunur:
- Bir başlık p_title
- bir url p_url
- Bir özet p_summary
- Bir gönderi içeriği p_content
- Ve kategoriler kategori.tagname
Arama terimimizle eşleşen her alan için ona bir puan vereceğiz. Skor maçın önemine göre belirlenir:
// tam terim eşleşmeleri başlıkta bulunur $scoreFullTitle = 6; // bölümdeki başlığı eşleştirin $scoreTitleKeyword = 5; // tam terim eşleşmeleri özette bulunur $scoreFullSummary = 5; // bölümdeki özeti eşleştirin $scoreSummaryKeyword = 4; // tam terim eşleşmeleri içerikte bulunur $scoreFullDocument = 4; // belgeyi bölümle eşleştirin $scoreDocumentKeyword = 3; // bir kategoriyle eşleşir $scoreCategoryKeyword = 2; // url ile eşleşir $scoreUrlKeyword = 1;
Başlamadan önce, kaldırılması gereken bir aramaya pek katkısı olmayan birkaç kelime var. Örnek "içinde", "it", "a", "bundan", "ve" ... . Bunları filtreleyeceğiz ve alakasız olduğunu düşündüğünüz herhangi bir kelimeyi eklemekten çekinmeyin. Başka bir şey, sorgumuzun uzunluğunu sınırlamak istiyoruz. Bir kullanıcının arama alanına bir roman yazmasını ve MySQL sunucumuzu çökertmesini istemiyoruz.
// Gereksiz kelimeleri arama teriminden kaldırın ve bir dizi işlevi olarak döndürün filterSearchKeys($query)( $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // bu listeyi kelimelerinizle genişletin $list = array("in","it","a","the","of","or","I","siz", $c = 0; foreach(explode(" ", $query) as $key)( if (in_array($key, $list))( devam; ) $words = $key; if ($c >= 15)( break; ) $c++ ; ) return $words; ) // word limit karakter karakter sayısı function limitChars($query, $limit = 200)( return substr($query, 0,$limit); )
Yardımcı fonksiyonlarımız artık karakter sayısını sınırlayabilir ve gereksiz kelimeleri filtreleyebilir. Algoritmamızı uygulama şeklimiz, her eşleşme bulduğumuzda bir puan vermektir. Kelimeleri if ifadesini kullanarak eşleştireceğiz ve daha fazla kelime eşleştirdikçe puan toplayacağız. Sonunda, sonuçlarımızı sıralamak için bu puanı kullanabiliriz.
Not: MySQL veritabanına nasıl bağlanılacağını göstermeyeceğim. Veritabanına verimli bir şekilde bağlanma konusunda sorun yaşıyorsanız, bunu okumanızı tavsiye ederim.
Önce fonksiyonumuza bir yapı verelim. Not Bölümleri ayrı ayrı uygulayabilmemiz için yer tutucular bıraktım.
function search($query)( $query = trim($query); if (mb_strlen($query)===0)( // boş aramaya gerek yok değil mi? return false; ) $query = limitChars($query) ; // Tartı puanları $scoreFullTitle = 6; $scoreTitleKeyword = 5; $scoreFullSummary = 5; $scoreSummaryKeyword = 4; $scoreFullDocument = 4; $scoreDocumentKeyword = 3; $scoreCategoryKeyword = 2; $scoreCategoryKeywords( $score =UrlKeywords( $scoreSummaryKeywords = 4) $sorgu); $escQuery = DB::escape($query); // db nesnesini almak için yukarıdaki nota bakın $titleSQL = dizi(); $sumSQL = dizi(); $docSQL = dizi(); $categorySQL = dizi (); $urlSQL = array(); /** Tam tekrarları eşleştirme PLACE HOLDER **/ /** Anahtar Kelimeleri Eşleştirme PLACE HOLDER **/ $sql = "SELECT p.p_id,p.p_title,p.p_date_published,p. p_url, p.p_summary,p.p_content,p.thumbnail, ((-- Başlık puanı ".implode(" + ", $titleSQL).")+ (-- Özet ".implode(" + ", $sumSQL) .")+ (-- belge ".implode(" + ", $docSQL).")+ (-- etiket/kategori ".implode(" + ", $categorySQL).")+ (-- url ". patlatmak(" + ", $urlSQL).")) alaka düzeyi olarak p NEREDE p.status = "yayınlandı" alaka düzeyine sahip >
Sorguda, tüm puanlar alaka değişkeni olarak toplanacak ve sonuçları sıralamak için bunu kullanabiliriz.
Tam oluşumları eşleştirme
Önce bazı anahtar kelimelerimiz olduğundan emin olduktan sonra sorgumuzu ekliyoruz.
If (count($keywords) > 1)( $titleSQL = "if (p_title LIKE "%".$escQuery."%",($scoreFullTitle),0)"; $sumSQL = "if (p_summary LIKE "%" .$escQuery."%",($scoreFullSummary),0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",($scoreFullDocument),0)"; )
Puanı yüksek olan maçlar bunlar. Arama terimi bunları içeren bir makaleyle eşleşirse, üstte görünme şansları daha yüksek olacaktır.
Eşleşen anahtar kelime oluşumları
Tüm anahtar kelimeler arasında dolaşıyoruz ve alanlardan herhangi biriyle eşleşip eşleşmediklerini kontrol ediyoruz. Bir gönderi birden fazla kategoriye sahip olabileceğinden, kategori eşleşmesi için bir alt sorgu kullandım.
Foreach($keywords as $key)( $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",($scoreTitleKeyword),0)"; $sumSQL = "if (p_summary) LIKE "%".DB::escape($key)."%",($scoreSummaryKeyword),0)"; $docSQL = "if (p_content LIKE "%".DB::escape($key)."% ",($scoreDocumentKeyword),0)"; $urlSQL = "if (p_url GİBİ "%".DB::escape($key)."%",($scoreUrlKeyword),0)"; $categorySQL = "if ((SELECT count(category.tag_id) KATEGORİDEN post_category ON'a KATIL post_category.tag_id = kategori.tag_id NEREDE post_category.post_id = p.post_id VE Category.name = "".DB::escape($key)."") > 0,($scoreCategoryKeyword),0)"; )
Ayrıca aşağıda bir yorumcunun işaret ettiği gibi, bu değişkenlerin boş diziler olmadığından emin olmalıyız yoksa sorgu başarısız olur.
// Sadece boş olması durumunda 0 ekleyin if (empty($titleSQL))( $titleSQL = 0; ) if (empty($sumSQL))( $sumSQL = 0; ) if (empty($docSQL))( $docSQL = 0; ) if (empty($urlSQL))( $urlSQL = 0; ) if (empty($tagSQL))( $tagSQL = 0; )
Sonunda, sorguların tümü birleştirilir ve gönderinin arama terimiyle alaka düzeyini belirlemek için bir araya getirilir.
// Gereksiz kelimeleri arama teriminden kaldırın ve bir dizi işlevi olarak döndürün filterSearchKeys($query)( $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // bu listeyi kelimelerinizle genişletin $list = array("in","it","a","the","of","or","I","siz", "o", "ben", "biz", "onlar", "o", "o", "ama", "bu", "bunlar", "o zaman"); $c = 0; foreach(explode(" ", $query) as $key)( if (in_array($key, $list))( devam; ) $words = $key; if ($c >= 15)( break; ) $c++ ; ) return $words; ) // kelimeleri sınırla karakter sayısı function limitChars($sorgu, $limit = 200)( return substr($sorgu, 0,$limit); ) function search($sorgu)( $sorgu = kırp ($query); if (mb_strlen($query)===0)( // boş aramaya gerek yok değil mi? return false; ) $query = limitChars($query); // Tartım puanları $scoreFullTitle = 6; $ scoreTitleKeyword = 5; $scoreFullSummary = 5; $scoreSummaryKeyword = 4; $scoreFullDocument = 4; $scoreDocumentKeyword = 3; $scoreCategoryKeyword = 2; $scoreUrlKe kelime = 1; $keywords = filterSearchKeys($sorgu); $escQuery = DB::escape($sorgu); // db nesnesini almak için yukarıdaki nota bakın $titleSQL = array(); $toplamSQL = dizi(); $docSQL = dizi(); $kategoriSQL = dizi(); $urlSQL = dizi(); /** Eşleşen tam oluşumlar **/ if (count($keywords) > 1)( $titleSQL = "if (p_title LIKE "%".$escQuery."%",($scoreFullTitle),0)"; $sumSQL = "if (p_summary LIKE "%".$escQuery."%",($scoreFullSummary),0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",($scoreFullDocument), 0)"; ) /** Anahtar Kelimeler Eşleşiyor **/ foreach($keywords as $key)( $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",($scoreTitleKeyword ),0)"; $sumSQL = "if (p_summary LIKE "%".DB::escape($key)."%",($scoreSummaryKeyword),0)"; $docSQL = "if (p_content LIKE "%" ".DB::escape($key)."%",($scoreDocumentKeyword),0)"; $urlSQL = "if (p_url GİBİ "%".DB::escape($key)."%",( $scoreUrlKeyword),0)"; $categorySQL = "if ((SELECT count(category.tag_id) KATEGORİSİNDEN post_category ON post_category.tag_id = kategori.tag_id NEREDE post_category.post_id = p.post_id AND kategori.name = "". DB::escape($key)."") > 0,($scoreCategoryKeyword),0)"; ) // Boşsa, 0 ekleyin if (empty($titleSQL))( $titleSQL = 0; ) eğer (boş($toplamSQL))( $toplamSQL = 0; ) if (empty($docSQL))( $docSQL = 0; ) if (empty($urlSQL))( $urlSQL = 0; ) if (boş($tagSQL))( $tagSQL = 0; ) $sql = " SELECT p.p_id,p.p_title,p.p_date_published,p.p_url, p.p_summary,p.p_content,p.thumbnail, ((-- Başlık puanı ".implode(" + ", $titleSQL). ")+ (-- Özet ".implode(" + ", $sumSQL).")+ (-- belge ".implode(" + ", $docSQL).")+ (-- etiket/kategori ".implode (" + ", $categorySQL).")+ (-- url ".implode(" + ", $urlSQL).")) alaka düzeyi olarak p gönderisinden itibaren p NEREDE p.status = "yayınlandı" alaka düzeyi > 0 SİPARİŞE GÖRE alaka düzeyi DESC,p.page_views DESC LIMIT 25"; $sonuçlar = DB::query($sql); if (!$results)( return false; ) return $sonuçlar; )
Artık search.php dosyanız şöyle görünebilir:
$term = isset($_GET["sorgu"])?$_GET["sorgu"]: ""; $search_results = arama($terim); if (!$search_results) ( echo "Sonuç yok"; çıkış; ) // Sonuçların olduğu sayfayı buraya yazdırın.
Adil miktarda içeriği işleyebilen basit bir arama algoritması oluşturduk. Her maç için keyfi olarak skoru seçtim, sizin için en uygun olana göre ayarlamaktan çekinmeyin. Ve her zaman iyileştirme için yer vardır.
Kullanıcılarınızdan gelen arama terimini izlemek iyi bir fikirdir, bu şekilde çoğu kullanıcının aynı şeyi arayıp aramadığını görebilirsiniz. Bir kalıp varsa, onlara bir gezi kaydedebilir ve kullanarak sonuçları önbelleğe alabilirsiniz. memcached.
Bu arama algoritmasını çalışırken görmek istiyorsanız, devam edin ve sayfanın üstündeki arama kutusunda bir makale aramayı deneyin. Metinde eşleşmenin bulunduğu kısmı döndürme gibi ekstra özellikler ekledim. Kendinize özellikler eklemekten çekinmeyin.
Bu makaleyi beğendin mi? Daha harikalarını okumak için abone olabilirsiniz. .
İlgili bir notta, burada bazı ilginç makaleler var.
Bir web sunucusunun her gün yaptığı bir şey varsa, o da veritabanına bağlanmaktır. PHP'yi uzun yıllardır kullanıyorum, ancak veritabanından veri almak için bir komut dosyası yazmamı isterseniz, önce birkaç örnek bulmak için Ultimate PHP kılavuzuna geri dönmeden yapamazdım.
Birkaç ay önce PHP versiyonumu güncelledim. PHP 5.4 ila 5.5 . Daha önce PHP'yi güncellerken hiç sorun yaşamadım. Gelişimini yakından takip ediyorum ve kullanımdan kaldırılmış işlevlerimi resmi olarak kaldırılmadan çok önce kaldırmaya çalışıyorum. Ama bu sefer hazırlıksız yakalandım. Web sitemin bir kısmını en aptalca sebepten dolayı sessizce kırdı.
Yorumlar(45)
Zaryel 12 Ağustos 2015:
Ian Mustafa 26 Eylül 2015:
Soymak 29 Eylül 2015:
adeem 11 Şubat 2016:
Ivan Venediktov 9 Nisan 2016.
Adamın doğum günü senaryosuözel dikkat gerektirir. Sonuçta, daha güçlü seks genellikle kutlamanın biçimini daha sıkı değerlendirir. Tatilleri organize etme konusundaki engin deneyimimiz, doğum günü kişisinin yaşına, karakterine ve ilgi alanlarına bağlı olarak bir doğum günü için mükemmel senaryoyu seçmemizi sağlar. Örneğin, bir erkeğin doğum günü için müşterilerimiz arasında en popüler olan bir senaryo sunuyoruz:
Sunucu telaffuz ediyor doğum günü tostu ve şu sözlerle biter:
Bardaklara şampanya dökmek
Ve birlikte her şeyi dibe içiyoruz!
Tostumuzu gençliğe kaldırıyoruz
Ve gençlik yalnız değil!
İlk tur bitti, yenisi başladı,
İkinci gençliğe girdin.
Önde gelen, güçlü ve sağlıklı bir adam,
Taze fikirler ve enerji dolusunuz.
Olduğun kadar enerjik kal.
Ne de olsa, yıllarca boşuna çalışmadın!
Aynı neşeli, sevimli ol,
Ve kader seni beladan uzak tutabilir!
Konuklar, olayın kahramanı için performans sergiliyor eski çingene romantizm
(ikisi şarkı söyleyebilir ve diğer herkes koroyu alır):
bardaklar dökülüyor
Kehribarın bir yansıması var,
Ve yüzler aydınlanır
Bir bahar şafağı gibi!
Şarapla hasret giderilir,
daha parlak oluyor
Ve kalbe bir tost sorar:
Yıldönümü için içiyoruz!
Koro:
Koromuz eski bir ezgi söylüyor,
Akan şampanya!
Senin için sevgili dostumuz,
Doğum günümüz (belki adı) canım!
daha harika ne olabilir
aşk eridiğinde
bir şarkıyla karşılandın
Aile ve arkadaşlar!
Akşam başlasın
Yeni bir yaşam döngüsü gibi
Ve tüm hayaller gerçek oluyor
Ve her şey etrafta çiçek açar!
Koro:
Aşağı Yukarı! Aşağı Yukarı! Aşağı Yukarı!
Müzikal duraklama.
sonra itiraf etti ebeveynlere tost.
lider:
Pekala, arkadaşlar, an geldi
Ebeveynleriniz için bir bardak doldurun!
Yaşam sevinci verenlere
Ve güzel dünyanın kapılarını açtı,
Ona nezaket öğretenler için
Ve cesaret sopasını teslim etti.
Şimdi kime teşekkür edenler için
Doğum günü çocuğumuz aramızda oturuyor!
Bu yüzden ebeveynlerimize içiyoruz ... (onları isimle ve soyadıyla çağırır)
Müzikal duraklama.
Ev sahibi kısaca günün kahramanının yaşam yolundan bahsediyor.
Ev sahibi: Ve şimdi şarkı söyleyeceğiz "Tatilimizin ana karakteri hakkında eski şarkılar".
(Misafirler pilotlarla ilgili bir şarkının melodisine şarkı söyler)
Günün kahramanı olmadan, kabul edelim, yapacak bir şey yok.
masanın etrafında toplanacağız
Dökme dolu bardaklar
Ve sağlığı için bir şarkı söyleyeceğiz:
Bizim için kutlama zamanı
Ve bu gün tanış
Bırakın yirmi ya da otuz olmasın, bırakın!
Gücünüzü azaltmayın!
Kesinlikle takip edeceğiz
Bizden saklanamazsın, biliyorsun!
Cesur, cesur, cesur görüyoruz
İnce, yakışıklı, kıvırcık saçlı bir adam!
Yıllar geçsin
Ama her zaman diliyoruz
Ruhun hala genç!
Bizim için kutlama zamanı
Kutlama zamanı, görkemli bir yıldönümünü kutlama zamanı!
Ve bu gün tanış
Büyük bir aile ve arkadaşlar şirketinde!
Kader bazen bize acımasız olsun, öyle olsun!
Ona cevap olarak, şakalarını bıraktın!
Aynısını sıkı bir şekilde takip edin
Etrafında umutsuzluğa izin verme!
Bu gece, bu gece, bu gece
Günün sevgili kahramanı olmadan yapacak bir şey yok!
Bir içeceğiz, iki içeceğiz
Yıldönümü ve iş için,
Ama yarın başınız ağrımasın!
Günün kahramanını seviyoruz saygılar
Ve tebriklerimiz devam ediyor!
(Konuklar “Doğum gününde seni alamam…” şarkısının melodisine şarkı söyler :)
Doğum gününü kutlayamayız
Sevgili Mercedes'i ver,
Ama bir hediye vereceğiz, şüphesiz,
Ve yüz kez tekrar etmeye hazırız:
Nazik, neşeli, özenli olduğunuzu
Ve iş dünyasında tanınmış bir uzman,
Ne hakkında harikasın?
Ve bir arkadaş, bir koca ve bir baba!
lider:
Sizi içtenlikle tebrik etmek istiyoruz,
Ayrıca pasaporttaki yaşı düzeltin,
Sonuçta, bakışın, gülüşün konuşuyor,
On yıldır pasaportta bir hata var!
(Konuklar bir askerin şarkısının melodisine şarkı söylerler "Yol uzun sen ve ben...")
Doğum günü çocuğu - cesur adam
Sırada bir şahin gibi görünüyor!
ona herkesten saygı duyuyoruz
Ve hizmette, savaşta olduğu gibi!
Koro:
________ (doğum günü kişinin adı) Yolda! Hadi yola çıkalım! Hadi yola çıkalım!
Yüz yıla ulaşmak
Ve güçlü kal
Kader seni çağırıyor!
________ (doğum günü adı) Git!
Günün sevgili kahramanı
Kalbimizin derinliklerinden tebrikler!
Ve bir madalya ve bir hediye veriyoruz
Onun büyük erdemlerinin bir simgesi olarak!
Koro.
Günün kahramanına bir hediye ve bir hatıra verilir. yazıt ile madalya: "İş, dostluk ve aşkta büyük hizmetler için." (Madalya tahtadan kesilebilir ve doğum günü erkeğinin boynuna bir kurdele ile asılabilir.
"Doğum günü erkeğini kim daha iyi tanır" konulu yarışma!
Yargıç doğum günü çocuğunun kendisi olacak.
Kolaylaştırıcı sorular sorar ve doğru cevaplar için fişler verir. Oyunun sonunda en fazla fişe sahip olan kişi, doğum günü erkeğinin imzasıyla bir ödül alır.
Müzikal duraklama.
Film doğum günü yarışması
Sevgili arkadaşlar! En bilgili konuğu belirlemeye çalışalım! Tema elbette aynı - Doğum günü. Sadece hayatta değil, ekranda!
Her doğru veya esprili cevap için bir fiş verilir. Testin sonuçlarına göre, en fazla sayıda fiş için bir ödül verilir. Örneğin, çikolata. Konuklar tahmin edemezlerse, sunucu bir ipucu vermeli, onlara bu film hakkında biraz hatırlatmalı.
Şaka soruları ve cevapları
Sorular ve cevaplarla iki çanta yaparsın. Önce kişi kime soru soracağını duyurur, bir soru çıkarır ve okur. Adını verdiği kişiye cevapların olduğu bir çanta verir. Sonra adı verilen kişi cevabı çıkarır ve okur. Ardından soruyu kime soracağını da duyurur, soruyu çıkarır ve okur. Vb.
Liderin emrinde dans edin
Tebrik telgrafları-bilmeceler (misafirlerden gelenler dahil)
Ev sahibi duyurur: Tanya için tebrik telgrafları geldi, ancak hepsi imzasız. Göndericiyi tahmin etmeniz gerekiyor. Bunlar herkes tarafından bilinen insanlar ve misafirlerdir. Ve hatta masal karakterleri!
Kulağına aşkı fısıldasınlar!
adında bir prenses... Kurbağa
Sadece kaliteli şaraplar içmek istiyorum!
İyi tatiller!… malvina
Gitarla daha sık şarkı söylemek istiyorum!
Size iyi bir şirket!… rotaru
Plansız aşkla tanışmamanızı dilerim!
Müzikalden merhaba… Bulanova
Yaşa Seryozha, eğlen ve havalı ol!
Çocukluğunuzu unutmayın!... Kraliçe
Size bol müzik ve kahkaha diliyorum,
aşk ve sonsuz gençlik! Piekha
Her zaman incir için para olsun!
Ve tavuk budu! baba yaga
Tarlada ve ormanda daha sık olun!
Elinize sağlık!… ayrıca
asla cesaretiniz kırılmasın!
Annemden kocaman bir merhaba!… Orbokait
Acil durumlara ve çatışmalara girmeyin!
Sana uzun bir ömür diliyorum! Grup… Oklar
İlk doğru cevabı veren kişiye fiş verilir. En yüksek fiş sayısı için bir ödül verilir.
Piyango bilmecesi
Ödül, sunum yapan kişinin çantada ne olduğunu tahmin edene verilir. Yönlendirici sorular sorabilirsiniz. Evet veya hayır diye cevap verir.
Piyango - tahmin
Herkes bir şaka, bir anekdot için bilet çıkarır ya da alır. Çekiliş sırasında ev sahibi şöyle der:
- Şimdi şansımızı deneyeceğiz ve biri için ne hazırladığını öğreneceğiz.
İlk sayıdan başlayarak hediyeler verir ve gelecek yılın tahminini okur.
"Var olmayan bir hayvan çiz" testi
Konuklardan var olmayan bir hayvan çizmelerini ve adını yazmalarını istiyorsunuz.
"Bir adam çiz" testi
12 şekilden bir kişi çizmeniz gerekiyor: tüm şekilleri kullanmanız gerekiyor - bir daire ve üçgenler, kareler. (toplam 12 tane var)
Akşamın sonunda konukları doğum günü çocuğu için bir banka hesabı açmaya davet edebilirsiniz. Ardından, tüm konukların on atabileceği 3 litrelik bir kavanoz çıkarın.
Altın Numaralar Güzel bir telefon numarası nasıl satılır
Kripto para madenciliği: basit kelimelerle nedir
En iyi dizüstü bilgisayar işletim sistemi: Eksiksiz inceleme
Sınıf arkadaşlarından müzik indirmek için programlar Sosyal ağ sınıf arkadaşlarından üzücü bir şarkı indirin
Yandex tarayıcısının mobil versiyonu