PHP 用strpos搜索子字符串

示例

strpos 可以理解为第一次出现针之前在干草堆中的字节数。

var_dump(strpos("haystack", "hay")); // 整数
var_dump(strpos("haystack", "stack")); // 整数(3)
var_dump(strpos("haystack", "stackoverflow"); // 布尔值(false)

检查子串是否存在

在检查TRUE或FALSE时要小心,因为如果返回索引0,则if语句会将其视为FALSE。

$pos = strpos("abcd", "a"); // $pos = 0;
$pos2 = strpos("abcd", "e"); // $pos2 =假;

// 检查针头的错误示例。
if($pos) { // 0与TRUE不匹配。
    echo "1. I found your string\n";
}
else {
    echo "1. I did not found your string\n";
}

// 检查是否发现针的工作示例。
if($pos !== FALSE) {
    echo "2. I found your string\n";
}
else {
    echo "2. I did not found your string\n";
}

// 检查是否找不到针
if($pos2 === FALSE) {
    echo "3. I did not found your string\n";
}
else {
    echo "3. I found your string\n";
}

整个示例的输出:

1. I did not found your string 
2. I found your string 
3. I did not found your string

从偏移量开始搜索

// 使用偏移量,我们可以搜索忽略偏移量之前的任何内容
$needle = "Hello";
$haystack = "Hello world! Hello World";

$pos = strpos($haystack, $needle, 1); // $pos = 13,而不是0

获取所有出现的子串

$haystack = "a baby, a cat, a donkey, a fish";
$needle = "a ";
$offsets = [];
// 从字符串的开头开始搜索
for($offset = 0;
        // 如果我们的偏移量超出了
        // 字符串,请勿搜索了。
        // 如果未设置此条件,将发出警告
        // 如果$haystack以$needle结尾则被触发
        // $needle只有一个字节长。
        $offset < strlen($haystack); ){
    $pos = strpos($haystack, $needle, $offset);
    // 我们没有子字符串了
    if($pos === false) break;
    $offsets[] = $pos;
    // 您可能要添加strlen($needle),
    // depending on whether you want to count "aaa"
    // as 1 or 2 "aa"s.
    $offset = $pos + 1;
}
echo json_encode($offsets); // [0,8,15,25]