Besoin d'regex pour analyser la « valeur » mot-clé = avec des guillemets simples ou doubles

StackOverflow https://stackoverflow.com/questions/962120

  •  12-09-2019
  •  | 
  •  

Question

Je vais avoir du mal à écrire une expression régulière (adapté pour la preg_match () de PHP) qui analysera les paires « valeur » mot-clé = indépendamment du fait que la chaîne est entre guillemets simples ou doubles. OIEau dans les deux cas suivants je dois obtenir le et où la chaîne peut contenir le type non englobante de citations:

name="value"
name='value'
Était-ce utile?

La solution

En Perl ceci est une expression régulière qui fonctionnerait. Elle a d'abord adapté au début de la ligne correspond alors à un ou plusieurs non = caractères et les ensembles à 1 $. Ensuite, il recherche les = alors les parenthèses non une avec un choix de contrepartie pour "ou" et établit que 2 $.

/^([^=]+)=(?:"([^"]+)"|'([^']+)')$/

Si vous voulez le faire correspondre les expressions vides comme.

= ""

Remplacer les deux dernières + avec un * Sinon, cela devrait fonctionner

Modifier Comme il est mentionné dans les commentaires. Doug utilisé ...

 /^\s?([^=]+)\s?=\s?("([^"]+)"|\'([^\']+)\')\s?/

Ceci va correspondre une espace blanc en option sur l'extrémité de l'éther de l'entrée ou de la valeur et il a retiré le marqueur de fin de ligne.

Autres conseils

/^(\w+?)=(['"])(\w+?)\2$/

Ce qui placera la clé dans $1 et la valeur $3.

Quelques années plus tard, mais étant donné que cette question est très bien classé sur Google, et les réponses ne répondait pas à mes besoins, voici une autre expression :

(?<key>\w+)\s*=\s*(['"]?)(?<val>(?:(?!\2)[^\\]|\\.|\w)+)\2

correspondra à des guillemets simples ou doubles, compte tenu de citations, et échappèrent valeurs non cotées.

name = bar
name = "bar"
name = 'bar'
name = "\"ba\"r\""

Il, cependant, a une limitation en ce que si une valeur est manquante la clé de la prochaine paire clé / valeur est lue. Cela peut être résolu en utilisant un séparées par des virgules liste de paires clé / valeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top