PHP dili uzun illərdir ki, veb tərtibatçıları arasında fəal şəkildə istifadə olunur. Hər bir proqram dilində olduğu kimi, PHP-də də ən yaxşı təcrübələr və az bilinən səhvlər/sui-istifadələr var. Bu dərsdə PHP strpos() Onun funksiyasını ən yaxşı şəkildə necə istifadə etmək və az bilinən məlumatlardan danışacağıq.

Doğru ilə müqayisə etməyin

PHP dilində strpos() funksiyası axtarılan mətnin başlanğıc mövqeyini qaytarır. strpos() Mətndə hədəfin tapılıb tapılmadığını axtararkən funksiyadan istifadə etdikdə, hədəf tapıldığında 1, tapılmadıqda 0 kodu qaytarır. Hədəf axtarılan mətnin ən əvvəlində tapılıbsa, 0 qayıdır. Bu, PHP-də tam olaraq bir səhv deyil, nəticədə aşağıdakı nümunə kimi yazılmış if sorğusunda hədəf mətnin varlığı axtarıldığında hədəf mətn başlanğıcda olur. 0 Bu, proqram təminatında xətaya səbəb olacaq, çünki o, qayıdacaqdır.

Misal:

$data = "Onur Özden Web Çözümleri";
$search = "Onur";

if (strpos($data, $search) === true) {
    echo "Metinde '{$search}' ifadesi geçiyor";
} else { // Bu blok çalışacak
    echo "Metinde '{$search}' ifadesi geçmiyor";
}
// Çıktı: Metinde 'Onur' ifadesi geçmiyor

Məsələn, else bloku işləyirdi. Bu səhvdir! Çünki nümunədə istifadə etdiyimiz mətndə “Onur” adı çəkilir. Bunun səbəbi strpos() Funksiyada əgər axtarılan mətn verilənlərin əvvəlindədirsə, funksiya " adlanır.0 cavabı qaytarmaqdır. Bəs biz bu problemin öhdəsindən necə gələ bilərik? Fərqli funksiyadan istifadə etməliyikmi? Xeyr. Buna ehtiyac yoxdur. Bu problemin çox sadə həlli var. Nümunəni nəzərdən keçirək və ətraflı izah edək.

$data = "Onur Özden Web Çözümleri";
$search = "Onur";

if (strpos($data, $search) !== false) { // Bu blok çalışacak
    echo "Metinde '{$search}' ifadesi geçiyor";
} else {
    echo "Metinde '{$search}' ifadesi geçmiyor";
}
// Çıktı: Metinde 'Onur' ifadesi geçiyor

Bu nümunədə if blokundakı müqayisə düzgün işləmişdir. Səbəb odur ki, bütün populyar proqramlaşdırma dilləri, o cümlədən PHP və hətta proqram məntiqi 0 dəyər false, 1 dəyər true kimi hesab edilir. Qaytarma dəyəri 0 olduğundan if blokunda boolean tipli müqayisə aparıldıqda 0 dəyəri yalan kimi işlənir və bu xəta baş verir.

Yalanla Müqayisə edərkən Ciddi Müqayisədən istifadə edin

Əvvəlki nümunədə diqqət yetirməli olduğumuz başqa bir çox vacib detal var. Ciddi müqayisə yerinə bərabərlik müqayisəsi (boş müqayisə) aparsaq, yenə eyni xəta ilə qarşılaşarıq. Bərabərlik müqayisəsi verilənlərin növünü şübhə altına almadığından, ekvivalentlik müqayisəsi məlumatların növünü də şübhə altına alır. Haqqında danışdığımızın səhv bir nümunəsini araşdıraq. Ekvivalentlik müqayisəsi olmadan bir nümunə edək və nəticəyə baxaq

$data = "Onur Özden Web Çözümleri";
$search = "Onur";

if (strpos($data, $search) != false) {
    echo "Metinde '{$search}' ifadesi geçiyor";
} else { // Bu blok çalışacak
    echo "Metinde '{$search}' ifadesi geçmiyor";
}
// Çıktı: Metinde 'Onur' ifadesi geçmiyor

Biz Rejim Həssaslığını İdarə edə bilərik

strpos() funksiyası defolt olaraq hərflərə həssasdır. Bu həssaslığı aradan qaldırmaq istəyiriksə, stripos() funksiyasından istifadə etməliyik. Stripos() funksiyasının nümunəsinə baxaq:

$data = "Onur Özden Web Çözümleri";
$search = "onur";

if (stripos($data, $search) !== false) {  // Bu blok çalışacak
    echo "Metinde '{$search}' ifadesi geçiyor";
} else {
    echo "Metinde '{$search}' ifadesi geçmiyor";
}
// Çıktı: Metinde 'Onur' ifadesi geçiyor

Biz strpos() funksiyası ilə Axtarılan Mətnin bir dəfədən çox baş verib-vermədiyini yoxlaya bilərik

1-ci misal:

Hədəf mətnin verilənlərdə neçə dəfə göründüyünü strpos() funksiyası ilə yoxlaya bilərik. 1-ci misalda bunun yaradıcı, lakin daha sadə və əsas yolunu, 2-ci misalda isə daha praktik olan ən yaxşı yolu göstərəcəyik.

$data = "Onur Özden Web Çözümleri, Onur Özden tarafından kurulmuştur. Onur Özden ve ekibi ile web yazılım geliştirme, wordpress teknik destek ve seo hizmetleri sunar.";
$search = "Onur";

// undefined hatası almamak için değişkenleri tanımla ve varsayılan olarak 0 değerini ver;
$position = 0;
$count = 0;

while (($position = strpos($data, $search, $position)) !== false) {
    $count++; // Kaçıncı kez geçtiğini say
    $position++; // Sonraki arama için pozisyonu artır

}

// Sonucu yazdır
echo "Veri içerisinde toplam {$count} adet '{$search}' kelimesi geçiyor<br>";

// Çıktı: Veri içerisinde toplam 3 adet 'Onur' kelimesi geçiyor

2-ci misal:

$data = "Onur Özden Web Çözümleri, Onur Özden tarafından kurulmuştur. Onur Özden ve ekibi ile web yazılım geliştirme, wordpress teknik destek ve seo hizmetleri sunar.";
$search = "Onur";

// substr_count fonksiyonu ile $search ifadesinin $data içindeki toplam sayısını hesapla
$count = substr_count($data, $search);

// veri içerisinde hedef kelime geçmiyorsa "0 adet geçiyor" gibi anlamsız bir ifade çıktılanmaması için koşul
if ($count > 0) { // veride hedef ifade geçtiği için bu blok çalışacak
    echo "Veri içerisinde toplam {$count} adet '{$search}' kelimesi geçiyor";
} else {
    echo "Veri içerisinde '{$search}' kelimesi geçmiyor.";
}
// Çıktı: Veri içerisinde toplam 3 adet 'Onur' kelimesi geçiyor

substr_count() Bir sözlə, funksiya hədəfdə neçə alt mətnin və neçə dəfə keçdiyini hesablayır. Bu funksiyanın ətraflı sənədləri və nümunələri ilə burada -> tapa bilərsiniz https://www.php.net/manual/function.substr-count.php

strpos() haqqında

Bu məqalədə strpos() Onun funksiyasından ən yaxşı şəkildə necə istifadə edəcəyimizi və ən çox yayılmış sui-istifadə hallarını düzəltməyi öyrəndik. strpos() funksiyası ilə stripos() və substr_count() Onların funksiyaları ilə də tanış olduq. Ən keyfiyyətli kodlaşdırma yanaşmaları haqqında seriyamızın qalan hissəsi üçün bizi izləyin.