Je crois que j'ai un truc qui marche avec les lookahead et lookbehind 
(?:^|(?<=\s))"([^"]+)"(?:$|(?=\s))
En quelques mots :
- (?:^|(?<=\s)) : si on n'est pas au début de la chaîne, on vérifie qu'il y a une espace avant le début de la correspondance ;
- "([^"]+)" : la partie « normale » du pattern, j'ai rajouté des parenthèses pour capturer le contenu des guillemets ;
- (?:$|(?=\s)) : si on n'est pas à la fin de la chaîne, on vérifie qu'il y a une espace après la fin de la correspondance.
Exemple avec ce script :
1 2 3 4 5 6 7 8 9 10 11 12
| <?php
header('Content-Type: text/html; charset=utf-8');
$pattern = '/(?:^|(?<=\s))"([^"]+)"(?:$|(?=\s))/';
$subject = '"bavoir" "salon""potiron" "magique" "élément"xavier "salut"';
preg_match_all($pattern, $subject, $matches);
echo '<pre>';
echo "$subject\n";
print_r($matches);
echo '</pre>';
?> |
J'obtiens :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| "bavoir" "salon""potiron" "magique" "élément"xavier "salut"
Array
(
[0] => Array
(
[0] => "bavoir"
[1] => "magique"
[2] => "salut"
)
[1] => Array
(
[0] => bavoir
[1] => magique
[2] => salut
)
) |
Partager