Je travaille sur un modèle de classe et j'ai un problème en essayant d'analyser une liste de chaînes entre guillemets dans une liste d'arguments. Prenons par exemple la chaîne:Expression rationnelle PHP pour faire correspondre des chaînes doubles et/ou simples entre guillemets
$string = 'VAR_SELECTED, \'Hello m\'lady\', "null"';
Je vais avoir un problème à venir avec un regex qui extrait la chaîne « Bonjour m'dame » et « null ». Le plus proche que j'ai est
$string = 'VAR_SELECTED, \'Hello m\'lady\', "null", \'TE\'ST\'';
preg_match_all('/(?:[^\']|\\\\.)+|(?:[^"]|\\\\.)+/', $string, $matches);
print_r($matches);
qui délivre en sortie:
Array
(
[0] => Array
(
[0] => VAR_SELECTED,
[1] => 'Hello m'lady',
[2] => "null",
[3] => 'TE'ST'
)
)
Cependant un cas plus complexe:
$string = 'VAR_SELECTED, \'Hello "Father"\', "Hello \'Luke\'"';
preg_match_all('/(?:[^\']|\\\\.)+|(?:[^"]|\\\\.)+/', $string, $matches);
print_r($matches);
sorties:
Array
(
[0] => Array
(
[0] => VAR_SELECTED,
[1] => 'Hello
[2] => "Father"
[3] => ',
[4] => "Hello
[5] => 'Luke'
[6] => "
)
)
Quelqu'un peut-il me aider résoudre ce problème? Les expressions régulières multiples sont-elles la voie à suivre?
Modifier Peut-être serait-il plus facile de remplacer les virgules dans les chaînes par un espace réservé, puis de les casser avec une explosion?
Édition 2 Juste pensé à une option non sécurisée simple (que je ne vais pas utiliser), mais génère une erreur E_NOTICE.
$string = 'return array(VAR_SELECTED, \'Hello , "Father"\', "Hello \'Luke\'4");';
$string = eval($string);
print_r($string);
Comment sauriez-vous que l'apostrophe de "m'lady" est contenue entre guillemets dans l'exemple que vous avez donné ci-dessus - cela ne se désagrégerait-il pas s'il y avait beaucoup plus de guillemets simples dans la chaîne? –
C'est un peu le point que j'essaie de contourner. – buggedcom