strpos()
işlevini en iyi şekilde nasıl kullanabileceğimizden ve az bilinen bilgilerden bahsedeceğiz. True ile Karşılaştırma Yapmayın
PHP dilinde strpos()
işlevi aranan metnin başlangıç pozisyonunu döndürür. strpos()
işlevini, metin içerisinde hedefin bulunup bulunmadığını ararken kullandığımızda, hedef bulunduğunda 1
, bulunamadığında 0
kodunu döndürür. Eğer hedef, arama yapılan metnin en başında bulunduysa yine 0
döndürür. Bu PHP’de tam olarak bir hata değildir, ancak sonuç olarak yazılan if sorgusunda aşağıdaki örnekteki gibi hedef metnin varlığı arandığında, hedef metin en başta olduğu durumda 0
döndüreceği için yazılımda hataya sebep olur.
Örnek:
$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
strpos()
işlevinde eğer aranan metin, verinin en başında ise işlevin “0
yanıtını döndürmesidir. Peki bu sorunu nasıl aşacağız? Farklı bir işlev mi kullanmamız gerekiyor? Hayır. Buna gerek yok. Bu sorunun çok basit bir çözümü var. Örnekte inceleyelim ve detaylandıralım.
$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 örnekte ise if bloğundaki karşılaştırma doğru şekilde çalıştı. Sebebi, PHP dahil tüm popüler yazılım dillerinde, hatta yazılım mantığında 0
değeri false
, 1
değeri true
olarak kabul edilir. Dönüş değeri 0 olduğundan dolayı if bloğunda 0 değeri boolean türünde karşılaştırma yapıldığında false olarak işlenir ve bu hata meydana gelir.
False ile Karşılaştırma Yaparken Denklik Karşılaştırması (Strict Comparison) Kullanın
Bir önceki işlediğimiz örnekte dikkat etmemiz gereken çok önemli bir detay daha var. Eğer denklik karşılaştırması (strict comparison/katı karşılaştırma) yerine eşitlik karşılaştırması (loose comparison/gevşek karşılaştırma) yaparsak yine aynı hatayla karşılaşırız. Çünkü eşitlik karşılaştırması verinin türünü sorgulamaz, denklik karşılaştırması ise veri türünü de sorgular. Bahsettiğimize dair hatalı bir örneği inceleyelim. Denklik karşılaştırması olmayan bir örnek yapalım ve sonucu görelim
$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
Büyük Küçük Harf Duyarlılığını Yönetebiliriz
strpos() işlevi varsayılan olarak büyük küçük harf duyarlıdır. Eğer bu duyarlılığı kaldırmak istiyorsak stripos() işlevini kullanmalıyız. stripos() işleviyle ilgili bir örnek inceleyelim:
$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
strpos() işlevi ile Aranan Metnin Birden Fazla Kez Olup Olmadığını Kontrol Edebiliriz
1.ci örnek:
strpos() işleviyle veride hedef metnin kaç kez geçtiğini kontrol edebiliriz. 1.ci örnekte bunun yaratıcı ama daha basit ve temel yöntemini, 2.ci örnekte ise çok daha pratik olan en iyi yolunu göstereceğiz.
$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
";
// Çıktı: Veri içerisinde toplam 3 adet 'Onur' kelimesi geçiyor
2.ci örnek:
$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()
işlevi kısaca hedef içerisinde kaç bir alt metinden kaç kez geçtiğini hesaplar. Bu işleve dair detaylı döküman ve örnekleri burada bulabilirsiniz -> https://www.php.net/manual/function.substr-count.php
strpos() Hakkında
Bu yazıda strpos()
işlevini en iyi şekilde kullanmayı ve en yaygın karşılaşılan bir yanlış kullanımın doğrusunu öğrendik. strpos()
işleviyle beraber stripos()
ve substr_count()
işlevlerini de tanıdık. En iyi kaliteli kodlama yaklaşımları serimizin devamı için takipte kalın.