PHP Найти все вхождения подстроки в строке

Мне нужно проанализировать 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, пока совпадение не будет найдено. Вы должны указать параметр смещения.

Примечание: в следующем примере поиск продолжается с символа next, а не с конца предыдущего совпадения. Согласно этой функции 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
)

Ответ 3

Лучше использовать substr_count. Посмотрите php.net

Ответ 4

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

Ответ 5

Используйте preg_match_all, чтобы найти все вхождения.

preg_match_all('/(\$[a-z]+)/i', $str, $matches);

Для дополнительной справки проверьте эту ссылку.

Ответ 6

Это можно сделать с помощью функции strpos(). Следующий код реализуется с использованием цикла for. Этот код довольно прост и довольно прост.

<?php

$str_test = "Hello World! welcome to php";

$count = 0;
$find = "o";
$positions = array();
for($i = 0; $i<strlen($str_test); $i++)
{
     $pos = strpos($str_test, $find, $count);
     if($pos == $count){
           $positions[] = $pos;
     }
     $count++;
}
foreach ($positions as $value) {
    echo '<br/>' .  $value . "<br />";
}

?>