Question Dreamweaver Regex - Inégalé) dans une expression régulière


Le problème

Le problème que je me pose est que les anciens développeurs d'un certain code, je travaille sur des variables définies comme $ _GET [nom] ou parfois comme $ _GET ["nom"]. En essayant de rendre le code uniforme, je veux tous les faire comme $ _GET ['name']

Solution essayée

Dans un script DreamWeaver personnalisé, j'ai utilisé les éléments suivants.

dreamweaver.setUpFindReplace({
    searchString: "\$(_POST|_SESSION|_GET)\[([^\'][0-9a-zA-Z _]+?[^\'])\]",
    replaceString: "$$1['$2']",
    searchWhat: "document",
    searchSource: true,
    useRegularExpressions: true
});
dreamweaver.replaceAll();

Informations supplémentaires

Pendant que j'obtiens l'erreur de l'exécuter à partir d'un script personnalisé, je ne l'obtiens pas lors de l'exécution des mêmes "searchString" et "replaceString" dans l'invite de recherche (CTRL + F).

L'invite de recherche trouvera et remplacera les instances où elle se produit.

Avant que quelqu'un ne souligne le fait - oui, je pourrais simplement lancer l'invite de recherche et le faire à partir de là, mais je dois toujours exécuter le script personnalisé pour exécuter les quelque 20 autres options de recherche et de remplacement.

Avez-vous des exemples de résultats finaux quelque part?

Bien sûr. J'ai le regex utilisé sur Regex 101 - https://regex101.com/r/bE9kN6/1

Finalement...

Quelqu'un sait-il comment arrêter le problème de parenthèse inégalé? J'ai essayé pendant un certain temps maintenant et je ne peux pas trouver une résolution car il n'y a pas de parenthèse inégalée.

Solution

Merci à Bob de l'avoir compris. Dreamweaver utilise la regex JS (que je ne pensais pas différente de PHP, mais qu’il s’agit de POSIX et que l’autre est perl-regex [ou quelque chose comme ça]) et que les littéraux doivent s'échapper avec \\ ne pas \.

Cela a rendu la fonction finale, fonctionnelle;

dreamweaver.setUpFindReplace({
    searchString: "\\$(_POST|_SESSION|_GET)\\[([^\'][0-9a-zA-Z _]+?[^\'])\\]",
    replaceString: "$$1['$2']",
    searchWhat: "document",
    searchSource: true,
    useRegularExpressions: true
});
dreamweaver.replaceAll();

2
2018-03-31 13:49


origine


Je ne peux voir aucune erreur (ni peut Regex101), et je suis amené à la conclusion que vous avez trouvé un bogue dans DreamWeaver. Je ne pense pas que la citation unique aurait une signification particulière dans le searchString paramètre, vous pouvez donc l’essayer sans la barre oblique précédente et voir si cela fonctionne. Si ce n'est pas le cas, essayez de simplifier la deuxième expression marquée jusqu'à ce que vous perdiez l'erreur: cela ne fera pas ce que vous voulez, mais cela n'a pas d'importance pour le moment. - AFH
Merci pour la réponse AFH. Il suffit de travailler et devant un ordinateur, alors essayez-le maintenant - je posterai bientôt ici. - MrMarlow
Ce serait un négatif - déshabillage jusqu'à \$(_POST|_SESSION|_GET)\[ donne "classe de caractères non terminée" mais fonctionne sur regex101 - et rend la recherche gourmande en utilisant \$(_POST|_SESSION|_GET)\[(.+?)\] ne remplace pas par le paramètre ReplaceWith. Commencer à ne pas aimer DW Regex. - MrMarlow
Tests complémentaires - même searchString: "\$(_POST|_SESSION|_GET)", replaceString: "\$_GET", ne remplace pas $ _POST et $ _SESSION par $ _GET. - MrMarlow
@ SlackBadger Avez-vous essayé d'échapper aux antislashs? Je n'ai pas utilisé DreamWeaver, mais cela ressemble beaucoup à JS et à un littéral de chaîne JS "\[" devient [ où vous voulez probablement "\\[" devenir \[. Essayez d'utiliser des barres obliques inverses doubles dans le littéral de chaîne partout où vous voulez une barre oblique inverse dans la regex réelle. - Bob


Réponses:


Votre fuite est un peu loin. Vous semblez utiliser JavaScript et le littéral de chaîne "\$(_POST|_SESSION|_GET)\[([^\'][0-9a-zA-Z _]+?[^\'])\]" évalue à $(_POST|_SESSION|_GET)[([^'][0-9a-zA-Z _]+?[^'])].

Au lieu de cela, vous devriez utiliser "\\$(_POST|_SESSION|_GET)\\[([^'][0-9a-zA-Z _]+?[^'])\\]", qui évalue à \$(_POST|_SESSION|_GET)\[([^'][0-9a-zA-Z _]+?[^'])\].


La raison en est que vous avez actuellement deux niveaux d'analyse, chacun avec ses propres règles d'échappement. Tout d'abord, vous avez le littéral de chaîne JavaScript, qui permet d'échapper à des choses comme \n pour une nouvelle ligne. Cependant, des séquences d'échappement non reconnues comme "\[" sont silencieusement avalés et produisent [. Le moteur regex voit [, indiquant le début d'une classe de caractères.

Vous souhaitez que le moteur regex reçoive des barres obliques inverses dans le modèle. Pour ce faire, vous devez d'abord générer une chaîne JS contenant des barres obliques inverses littérales. Ce qui signifie que vous devez échapper aux antislash eux-mêmes dans le littéral de chaîne, "\\" produit \, par exemple. "\\[" produit la chaîne \[. De cette façon, le moteur regex voit \[, indiquant un crochet échappé (littéral).

L'autre chose est que les guillemets simples n'ont pas besoin d'être échappés du tout, car ils ne contiennent aucune signification particulière dans regex et les guillemets simples dans une chaîne entre guillemets doubles sont traités comme des caractères normaux par JS.


Il y a une autre option, mais je ne suis pas sûr que DreamWeaver l'accepte. JavaScript a un syntaxe littérale spéciale regex, vous n'avez donc pas besoin de créer une chaîne en premier. En sautant cette étape d'analyse supplémentaire, vous évitez de devoir faire une double évasion. Un littéral de regex JS est de la forme /pattern/options(Les barres obliques doivent être échappées, mais vous n’en avez pas dans ce modèle). Donc, votre modèle peut être exprimé comme /\$(_POST|_SESSION|_GET)\[([^'][0-9a-zA-Z _]+?[^'])\]/. Encore une fois, les guillemets simples ne doivent pas être échappés du tout.

Si DreamWeaver prend en charge la syntaxe littérale regex, il s'agit en fait de l'option préférée.


1
2018-04-04 10:07



You may award your bounty in 21 hours - Je vais donner ça le matin :) - MrMarlow
Bien vu - cela m'a complètement manqué. - AFH
Maintenant sélectionné comme meilleure réponse - je voudrais aussi vous voter, mais apparemment j'ai besoin de 15 points de réputation pour cela et donner 100 points signifie que je suis maintenant à 13 ans - mauvais moments! - MrMarlow