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çmiyorMə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çiyorBu 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çmiyorBiz 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çiyorBiz 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çiyor2-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çiyorsubstr_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.



