Martti, ressuscitant cette question parce qu'il y avait une solution simple qui vous permet de faire le remplacer en une seule fois-pas besoin d'imploser. (Trouvé votre question tout en faisant des recherches pour une question générale sur how to exclude patterns in regex.)
Voici notre simple, regex:
"[^"]*"(*SKIP)(*F)|\s+
Le côté gauche de l'alternance correspond complète "quoted strings"
puis échoue délibérément. Le côté droit correspond aux caractères d'espaces, et nous savons qu'ils sont les bons caractères d'espaces, car ils ne correspondaient pas à l'expression à gauche.
Ce code montre comment utiliser les expressions régulières (voir les résultats en bas de la online demo):
<?php
$regex = '~"[^"]*"(*SKIP)(*F)|\s+~';
$subject = 'hola hola "pepsi cola" yay';
$replaced = preg_replace($regex,"",$subject);
echo $replaced."<br />\n";
?>
Référence
How to match (or replace) a pattern except in situations s1, s2, s3...
Peut guillemets doubles se sont échappés entre guillemets, ou est-ce un non-isse (par exemple, «hola hola» pepsi «cola» yay »devenir« holahola »pepsi« cola »yay» ou «hola hola» pepsi «cola» yay)? – Wrikken