Besoin d'regex pour analyser la « valeur » mot-clé = avec des guillemets simples ou doubles
-
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
name="value"
name='value'
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.