زبان PHP سالهاست که بطور فعال در بین توسعه دهندگان وب مورد استفاده قرار گرفته است. مانند هر زبان نرم افزاری، PHP دارای بهترین شیوه ها و خطاها/سوء استفاده های کمتر شناخته شده است. در این درس PHP strpos() ما در مورد نحوه استفاده از عملکرد آن به بهترین شکل و اطلاعات کمتر شناخته شده صحبت خواهیم کرد.
با درست مقایسه نکن
به زبان PHP strpos() تابع موقعیت شروع متن جستجو شده را برمی گرداند. strpos() هنگامی که از تابع در هنگام جستجوی اینکه آیا هدف در متن یافت می شود استفاده می کنیم، زمانی که هدف پیدا می شود 1، زمانی که پیدا نشد 0 کد را برمی گرداند. اگر هدف در همان ابتدای متن جستجو شده پیدا شد، 0 برمی گرداند. این دقیقاً یک اشکال در PHP نیست، اما در نتیجه، زمانی که وجود متن مورد نظر در پرس و جوی if که به عنوان مثال زیر نوشته شده است جستجو می شود، متن مورد نظر در ابتدا قرار دارد. 0 باعث ایجاد خطا در نرم افزار می شود زیرا برمی گردد.
مثال:
$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در مثال، بلوک else کار می کرد. این اشتباه است! زیرا در متنی که در مثال استفاده کردیم، نام «Onur» آمده است. این به این دلیل است strpos() در تابع، اگر متن جستجو شده در ابتدای داده باشد، تابع نامیده می شود.0 برای برگرداندن پاسخ است. پس چگونه بر این مشکل غلبه کنیم؟ آیا باید از تابع دیگری استفاده کنیم؟ خیر نیازی به این کار نیست. راه حل بسیار ساده ای برای این مشکل وجود دارد. بیایید مثال را بررسی کنیم و جزئیات آن را بررسی کنیم.
$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در این مثال، مقایسه در بلوک if به درستی انجام شد. دلیل آن این است که همه زبان های برنامه نویسی محبوب از جمله PHP و حتی منطق نرم افزار 0 ارزش false, 1 ارزش true به عنوان در نظر گرفته شده است. از آنجایی که مقدار برگشتی 0 است، هنگامی که یک مقایسه نوع بولی در بلوک if انجام می شود، مقدار 0 به عنوان false پردازش می شود و این خطا رخ می دهد.
هنگام مقایسه با نادرست از مقایسه دقیق استفاده کنید
جزئیات بسیار مهم دیگری وجود دارد که در مثال قبل باید به آن توجه کنیم. اگر به جای مقایسه دقیق، یک مقایسه برابری (مقایسه سست) انجام دهیم، دوباره با همان خطا مواجه خواهیم شد. از آنجایی که مقایسه برابری نوع داده ها را زیر سوال نمی برد، مقایسه هم ارزی نوع داده ها را نیز زیر سوال می برد. بیایید یک مثال نادرست از آنچه در مورد آن صحبت می کنیم را بررسی کنیم. بیایید یک مثال بدون مقایسه هم ارزی انجام دهیم و نتیجه را ببینیم
$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ما می توانیم حساسیت موردی را مدیریت کنیم
تابع strpos() به طور پیش فرض به حروف بزرگ و کوچک حساس است. اگر بخواهیم این حساسیت را حذف کنیم باید از تابع stripos() استفاده کنیم. بیایید به مثالی از تابع stripos() نگاه کنیم:
$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() رخ میدهد یا خیر
مثال 1:
با تابع strpos() می توانیم بررسی کنیم که متن مورد نظر چند بار در داده ها ظاهر می شود. در مثال اول روش خلاقانه اما ساده تر و ابتدایی این کار را نشان می دهیم و در مثال دوم بهترین راه را که بسیار کاربردی تر است نشان می دهیم.
$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مثال دوم:
$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() به طور خلاصه، تابع محاسبه می کند که چند زیرمتن در هدف ارسال شده و چند بار ارسال می شود. شما می توانید مستندات دقیق و نمونه هایی از این تابع را در اینجا -> پیدا کنید https://www.php.net/manual/function.substr-count.php
درباره strpos()
در این مقاله strpos() ما یاد گرفتیم که چگونه از عملکرد آن به بهترین شکل استفاده کنیم و رایج ترین سوء استفاده را اصلاح کنیم. strpos() با عملکردش stripos() ve substr_count() ما همچنین با عملکرد آنها آشنا شدیم. منتظر ادامه سری ما در مورد بهترین کیفیت کدنویسی باشید.



