Вы можете использовать это регулярное выражение:
$s = '"apple google" AND bing NOT yahoo "word a-b"';
$r = preg_replace('/(?=(([^"]*"){2})*[^"]*$)(?<!AND|NOT|OR) +(?!-|AND|NOT|OR)/i',
' ## ', $s);
echo "$r"; // "apple google" AND bing NOT yahoo ## "word a-b"
Это предполагает, что кавычки сбалансированы на входе, поскольку он обнаруживает текст внутри кавычек, подсчитывая даже число кавычек, следующих в lookahead.