Вы можете использовать \G
якорь
(?:\?|\G(?!^))\K\.[a-zA-Z]+
По частям:
(?:
Группа без захвата \?
Матч ?
|
Или \G(?!^)
Утверждение позиции в конце предыдущего матча, а не в начале
)
Закрыть группу \K\.[a-zA-Z]+
Забыть то, что в настоящее время соответствует, и сопоставить символы .
и 1+ a-zA-Z
Regex demo | Php демо
$re = '/(?:\?|\G(?!^))\K\.[a-zA-Z]+/';
$str = 'othertext ?.abc.de.fgh.i moretext';
preg_match_all($re, $str, $matches);
var_dump($matches[0]);
Выход
array(4) {
[0]=>
string(4) ".abc"
[1]=>
string(3) ".de"
[2]=>
string(4) ".fgh"
[3]=>
string(2) ".i"
}