Методы, основанные на
strpos
, ничего не скажут о словах позиций, они могут найти только подстрок текста. Попробуйте регулярные выражения:
preg_match_all('~\b(?:' . implode('|', $words) . ')\b~', $text, $m, PREG_OFFSET_CAPTURE);
$map = array();
foreach($m[0] as $e) $map[$e[0]][] = $e[1];
это генерирует карту положения слова как это
'word1' => array(pos1, pos2, ...),
'word2' => array(pos1, pos2, ...),
Получив это, вы можете легко найти первые / последние позиции, используя
$firstPosOfEachWord = array_map('min', $map);