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

2-ри пример:

$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() Накратко, функцията изчислява колко подтекста са предадени в целта и колко пъти. Можете да намерите подробна документация и примери за тази функция тук -> https://www.php.net/manual/function.substr-count.php

Относно strpos()

В тази статия strpos() Научихме как да използваме функцията му по най-добрия начин и да коригираме най-често срещаните злоупотреби. strpos() със своята функция stripos() и substr_count() Запознахме се и с техните функции. Очаквайте останалата част от нашата поредица за най-качествените подходи за кодиране.