PHP查找字符串中出现的所有子字符串

mun*_*lli 52 php string

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

我目前将HTML加载到字符串变量中.我只想要字符位置,所以我可以遍历列表以返回字符串后的一些数据.

strpos函数仅返回第一个匹配项.如何归还所有这些?

Ada*_*her 76

不使用正则表达式,这样的东西应该用于返回字符串位置:

$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 />";
}
Run Code Online (Sandbox Code Playgroud)

  • 请小心使用`if`语句中的赋值.在这种情况下,你的`while`循环不适用于位置'0'.我已经更新了你的答案. (11认同)
  • 非常好的修复,但对于那些需要找到特殊字符(é,ë,...)的人来说,用mb_strpos替换strpos,否则它将无法正常工作 (4认同)

Sal*_*n A 16

您可以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"));
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [0] => 0
    [1] => 1
    [2] => 8
    [3] => 9
    [4] => 16
    [5] => 17
)
Run Code Online (Sandbox Code Playgroud)


Nir*_*Ram 12

它更好用substr_count.在php.net上查看

  • 这只会给你计数,而不是问题的位置 (8认同)
  • “这个函数不计算重叠的子串。” 对于字符串 'abababa',当您查看 'aba' 时,它只会计算 2 次而不是 3 (2认同)

Ryo*_*odo 6

function getocurence($chaine,$rechercher)
        {
            $lastPos = 0;
            $positions = array();
            while (($lastPos = strpos($chaine, $rechercher, $lastPos))!== false)
            {
                $positions[] = $lastPos;
                $lastPos = $lastPos + strlen($rechercher);
            }
            return $positions;
        }
Run Code Online (Sandbox Code Playgroud)

  • 纯代码答案在 StackOverflow 上的价值很低,因为它们对 OP 和未来的读者的教育作用很小。请编辑您的答案,以教育成千上万未来的 SO 读者和 OP。 (3认同)