PHP 查找字符串中子字符串的所有匹配项

2022-08-30 08:54:15

我需要解析HTML文档并查找其中所有出现的字符串。asdf

我目前已将HTML加载到字符串变量中。我只想要字符位置,这样我就可以遍历列表以在字符串之后返回一些数据。

该函数仅返回第一个匹配项。如何将其全部退回?strpos


答案 1

在不使用正则表达式的情况下,类似下面的内容应该适用于返回字符串位置:

$html = "dddasdfdddasdffff";
$needle = "asdf";
$lastPos = 0;
$positions = array();

while (($lastPos = strpos($html, $needle, $lastPos))!== false) {
    $positions[] = $lastPos;
    $lastPos = $lastPos + strlen($needle);
}

// Displays 3 and 10
foreach ($positions as $value) {
    echo $value ."<br />";
}

答案 2

您可以重复调用 strpos 函数,直到找不到匹配项。必须指定偏移参数。

注意:在以下示例中,搜索从下一个字符开始,而不是从上一个匹配项的末尾继续。根据此函数,aaaa 包含次子字符串 aa 的出现,而不是两次。

function strpos_all($haystack, $needle) {
    $offset = 0;
    $allpos = array();
    while (($pos = strpos($haystack, $needle, $offset)) !== FALSE) {
        $offset   = $pos + 1;
        $allpos[] = $pos;
    }
    return $allpos;
}
print_r(strpos_all("aaa bbb aaa bbb aaa bbb", "aa"));

输出:

Array
(
    [0] => 0
    [1] => 1
    [2] => 8
    [3] => 9
    [4] => 16
    [5] => 17
)

推荐