2010-09-29 4 views
4

Je dois supprimer tous les espaces de la chaîne, mais les citations doivent rester telles quelles.Suppression des espaces-caractères, sauf entre guillemets dans PHP?

Voici un exemple:

string to parse: 
hola hola "pepsi cola" yay 

output: 
holahola"pepsi cola"yay 

Toute idée? Je suis sûr que cela peut être fait avec regex, mais toute solution est d'accord.

+0

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

Répondre

5

On pourrait correspondre à des chaînes ou des citations avec

[^\s"]+|"[^"]*" 

donc nous avons juste besoin preg_match_all et concaténer le résultat.


Example:

$str = 'hola hola "pepsi cola" yay'; 

preg_match_all('/[^\s"]+|"[^"]*"/', $str, $matches); 

echo implode('', $matches[0]); 
// holahola"pepsi cola"yay 
2

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...

Questions connexes