С помощью пользователя MizardX из #regex irc channel (irc.freenode.net) было найдено решение. Он даже поддерживает одинарные кавычки.
$str= 'word1 word2 \'this is a phrase\' word3 word4 "this is a second phrase" word5 word1 word2 "this is a phrase" word3 word4 "this is a second phrase" word5';
$regexp = '/\G(?:"[^"]*"|\'[^\']*\'|[^"\'\s]+)*\K\s+/';
$arr = preg_split($regexp, $str);
print_r($arr);
Результат:
Array (
[0] => word1
[1] => word2
[2] => 'this is a phrase'
[3] => word3
[4] => word4
[5] => "this is a second phrase"
[6] => word5
[7] => word1
[8] => word2
[9] => "this is a phrase"
[10] => word3
[11] => word4
[12] => "this is a second phrase"
[13] => word5
)
PS. Единственным недостатком является то, что это регулярное выражение работает только для PCRE 7.
Оказалось, что у меня нет поддержки PCRE 7 на производственном сервере, там установлен только PCRE 6. Несмотря на то, что он не так гибок, как предыдущий для PCRE 7, регулярное выражение, которое будет работать (избавлено от \ G и \ K):
/(?:"[^"]*"|\'[^\']*\'|[^"\'\s]+)+/
Для данного ввода результат такой же, как указано выше.