2009-11-22 5 views
2

J'ai ce regex:Regex, guillemet simple ou double citation

preg_replace(
    '/\["'.$key.'"\] = (.+?);/is', '["'.$key.'"] = '.$newValue.';', 
    $contents); 

Il écrit une valeur de tableau dans un fichier de configuration. Je dois autoriser des guillemets simples ou doubles autour de la clé du tableau et je ne suis pas sûr de savoir comment le faire. Je n'ai pas écrit cette regex.

Répondre

2

Vous pouvez remplacer le "trouver" regex pour correspondre à deux types de citations:

'/\[[\'"]'.$key.'[\'"]\] = (.+?);/is' 

Ce sera même match:

["MegaKey'] = UberValue; 

Et si je vous, je mettrais cette configuration fichier sur la liste des choses à réécrire sans regexes.

1

Eh bien, vous pouvez le faire en arrière-référencement pour correspondre à l'ensemble correct des citations utilisées (ouvriez avec double, fermé avec double)

preg_replace(
    '/\[([\"\']+)'.$key.'\\1\]\s=\s(.+?);/is', '[\\1'.$key.'\\1] = '.$newValue.';', 
    $contents); 

\\1 correspond au premier type de citation utilisé

+0

+1 est-il intentionnel de faire correspondre un certain nombre de citations comme '' bien – Andomar

+0

[ « ' « touche » »], nous pouvons aussi ne faites correspondre qu'une seule citation en utilisant les options {1} ' – mauris

5

Comme d'habitude La façon de gérer plusieurs styles de citations est de les épeler: /'a'|"a"/, en dupliquant ce qui est à l'intérieur des citations, bien qu'il puisse être légèrement différent (par exemple, pour interdire un guillemet simple sans échappement dans une chaîne entre guillemets)

'/\[("'.$key.'"|\''.$key.'\')\] = (.+?);/is' 

Vous pouvez aussi, parfois, utilisez une référence arrière:

'/\[([\'"])'.$key.'\\1\] = (.+?);/is' 
+0

+1 nice; Je pense que la référence arrière a besoin d'une double évasion comme '\\ 1' – Andomar

+0

Merci, en utilisant des littéraux de chaîne de caractères trop récemment. :) –

+0

+1 backref est la meilleure solution ici, moins susceptible d'accepter un non-sens '['' asdf ']'. \\ 1 serait nécessaire si l'expression rationnelle était entre guillemets. – scribble

Questions connexes