Почему бы просто не получить все периоды, а затем пробел и использовать только некоторые результаты?
preg_match_all('!\. !', $str, $matches);
echo $matches[0][1]; // second match
Я не уверен, что именно вы хотите захватить из этого, однако. Ваш вопрос немного расплывчатый.
Теперь, если вы хотите захватить все до второго периода (включая пробел) включительно, попробуйте:
preg_match_all('!^((?:.*?\. ){2})!s', $str, $matches);
Используется не жадный символ подстановки, а DOTALL
, поэтому .
соответствует символу новой строки.
Если вы не хотите захватывать последний пробел, вы можете сделать это тоже:
preg_match_all('!^((?:.*?\.(?= )){2})!s', $str, $matches);
Также вы можете разрешить подсчет окончания строки, что означает либо:
preg_match_all('!^((?:.*?\.(?: |\z)){2})!s', $str, $matches);
или
preg_match_all('!^((?:.*?\.(?= |\z)){2})!s', $str, $matches);
Наконец, так как вы после одного матча и хотите первый, вы могли бы просто использовать для этого preg_match()
вместо preg_match_all()
.