PHP 语言多年来一直在 Web 开发人员中积极使用。与每种软件语言一样,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块中进行boolean类型比较时,会将值0处理为false,从而出现此错误。

与 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() 函数检查搜索的文本是否出现多次

第一个例子:

我们可以使用 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çiyor

substr_count() 简而言之,该函数计算目标中传递了多少个子文本以及传递了多少次。您可以在这里找到此功能的详细文档和示例 -> https://www.php.net/manual/function.substr-count.php

关于 strpos()

在这篇文章中 strpos() 我们学习了如何以最佳方式使用其功能并纠正最常见的误用。 strpos() 以其功能 stripos() 和 substr_count() 我们还了解了它们的功能。请继续关注我们有关最佳质量编码方法的系列的其余部分。