Adamın doğum günü senaryosu. PHP ve MySQL WordPress'te Katmanlı Menü: Bir Gönderiden Görüntü Almak için Normal Bir İfade Kullanma

  • 20.06.2020

ş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" ] =<< %num%. %isim%%bağlam%

SON; $FORMS["search_empty_result" ] =<<Afedersiniz. Bu sorgu için sonuç bulunamadı.

SON; ?>

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."[^>]*>(.*?).")", $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. , html sayfasında.

$fp = fopen("http://www.catswhocode.com/blog","r"); while (!feof($fp))( $sayfa .= fgets($fp, 4096); ) $titre = eregi(" (.*)",$sayfa,$regs); echo $regs; fclose($fp);

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:

PHP, jQuery arama demosu

ajax kelimesini girmeyi deneyin


için sonuçlar


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 .="

  • " .str_ireplace($kelime, $kalın, $sonuç) . "
  • "; ) echo $end_result; ) else ( echo "
  • İsteğiniz için hiçbir şey bulunamadı
  • "; } } ?>

    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 okuma

    Arama, 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.