Dreamweaver Regex - Unübertroffen) im regulären Ausdruck

776
MrMarlow

Die Angelegenheit

Das Problem, mit dem ich mich beschäftige, ist, dass in der Vergangenheit Entwickler von Code mit Variablen wie $ _GET [Name] oder manchmal wie $ _GET ['Name'] gearbeitet haben. Um den Code einheitlich zu machen, möchte ich alle wie $ _GET ['name'] machen.

Versuchte Lösung

In einem benutzerdefinierten DreamWeaver-Skript habe ich Folgendes verwendet.

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

Zusatzinformation

Während ich den Fehler von einem benutzerdefinierten Skript bekomme, erhalte ich es nicht, wenn "searchString" und "replaceString" in der Find-Eingabeaufforderung (STRG + F) ausgeführt werden.

Die Suchabfrage wird die Fälle, in denen sie auftritt, gerne finden und ersetzen.

Bevor jemand möglicherweise auf die Tatsache hinweist - ja, ich könnte einfach die Suchabfrage ausführen und von dort aus ausführen, aber ich muss immer noch das benutzerdefinierte Skript ausführen, um die anderen 20 Such- und Ersetzungsoptionen auszuführen.

Hast du irgendwo Beispiel-Endergebnisse?

Sicher tun. Ich habe den Regex auf Regex 101 verwendet - https://regex101.com/r/bE9kN6/1

Endlich...

Weiß jemand, wie man das unübertroffene Klammerproblem aufhält? Ich versuche es schon eine Weile und ich kann keine Lösung finden, da es keine unübertroffenen Klammern gibt.

Lösung

Danke an Bob, dass du das herausgefunden hast. Dreamweaver verwendet JS Regex (was meiner Meinung nach nicht anders war als PHP, aber es stellt sich heraus, dass es sich um POSIX handelt und einer ist Perl-Regex [oder so ...]) und dass Literale \\nicht mit flüchten müssen \.

Dies machte die endgültige funktionierende Funktion;

dreamweaver.setUpFindReplace({ searchString: "\\$(_POST|_SESSION|_GET)\\[([^\'][0-9a-zA-Z _]+?[^\'])\\]", replaceString: "$$1['$2']", searchWhat: "document", searchSource: true, useRegularExpressions: true }); dreamweaver.replaceAll(); 
2
Ich kann keine Fehler sehen (auch nicht Regex101), und ich bin zu der Schlussfolgerung gelangt, dass Sie einen Fehler in DreamWeaver gefunden haben. Ich denke nicht, dass das einfache Anführungszeichen im Parameter `searchString` eine besondere Bedeutung haben würde. Sie können es also ohne den vorangestellten umgekehrten Schrägstrich ausprobieren und sehen, ob das rundherum funktioniert. Wenn dies nicht der Fall ist, vereinfachen Sie den zweiten markierten Ausdruck, bis Sie den Fehler verlieren: Er wird nicht das tun, was Sie wollen, aber das ist vorerst egal. AFH vor 8 Jahren 0
Danke für die Antwort AFH. Bin gerade an die Arbeit und vor einem Computer, also soll ich das jetzt versuchen - ich werde in Kürze hier posten. MrMarlow vor 8 Jahren 0
Das wäre ein negativer Weg - zurück zu `\ $ (_ POST | _SESSION | _GET). \ [` Gibt eine "nicht abgeschlossene Zeichenklasse" aus, funktioniert aber auf regex101 - und macht die Suche mit `\ $ (_ POST | _SESSION | _GET) \ [(. +?) \] `Wird nicht durch den ReplaceWith-Parameter ersetzt. Beginnen, DW Regex nicht zu mögen. MrMarlow vor 8 Jahren 0
Weitere Tests - auch `searchString:" \ $ (_ POST | _SESSION | _GET) ", replaceString:" \ $ _ GET ",` ersetzt nicht $ _POST und $ _SESSION durch $ _GET. MrMarlow vor 8 Jahren 0
@SlackBadger Hast du versucht, den Backslashes zu entkommen? Ich habe DreamWeaver nicht verwendet, aber das sieht sehr nach JS aus und in einem JS-String-Literal "" \ ["" wird zu "[", wo Sie wahrscheinlich "" \\ ["" zu `\ [` werden wollen. Verwenden Sie doppelte umgekehrte Schrägstriche im Zeichenfolgenliteral, wo immer Sie einen umgekehrten Schrägstrich in der eigentlichen Regex möchten. Bob vor 8 Jahren 0
Bob, ich liebe dich jetzt. Sie hatten Recht, es ist JS Regex und das Problem wurde gelöst. Wenn Sie das in eine Antwort werfen könnten - Sie können die akzeptierte Antwort und die 100-Punkte-Prämie nehmen :) MrMarlow vor 8 Jahren 0
Gut zu hören! Ich werde eine richtige Antwort schreiben, wenn ich nach Hause komme. Mobiles Tippen ist scheiße. Bob vor 8 Jahren 0

1 Antwort auf die Frage

1
Bob

Ihre Flucht ist ein bisschen aus. Sie scheinen JavaScript zu verwenden, und das Zeichenfolgenliteral wird in "\$(_POST|_SESSION|_GET)\[([^\'][0-9a-zA-Z _]+?[^\'])\]"ausgewertet $(_POST|_SESSION|_GET)[([^'][0-9a-zA-Z _]+?[^'])].

Stattdessen sollten Sie verwenden "\\$(_POST|_SESSION|_GET)\\[([^'][0-9a-zA-Z _]+?[^'])\\]", was zu auswertet \$(_POST|_SESSION|_GET)\[([^'][0-9a-zA-Z _]+?[^'])\].


Der Grund dafür ist, dass Sie tatsächlich zwei Ebenen des Parsing haben, von denen jede ihre eigenen Escape-Regeln hat. Erstens haben Sie das JavaScript-Zeichenfolgenliteral, mit dem Sie Dinge wie \nfür eine neue Zeile umgehen können. Nicht erkannte Escape-Sequenzen wie "\["werden jedoch lautlos verschluckt und produzieren [. Die Regex-Engine sieht [, dass der Beginn einer Zeichenklasse angezeigt wird.

Sie möchten, dass die Regex-Engine wörtliche Backslashes im Muster empfängt. Dazu müssen Sie zunächst eine JS-Zeichenfolge mit literalen Backslashes erstellen. Was bedeutet, dass Sie die Backslashes selbst im String-Literal entkommen müssen, also "\\"produziert \, zB "\\["den String erzeugt \[. Auf diese Weise erkennt die Regex-Engine \[eine abgehackte (wörtliche) Klammer.

Die andere Sache ist, dass die einfachen Anführungszeichen nicht unbedingt mit Escapezeichen versehen werden müssen, da sie in regulären Ausdrücken keine besondere Bedeutung haben, und einfache Anführungszeichen in einer doppelten Anführungszeichenfolge werden von JS als normale Zeichen behandelt.


Es gibt eine andere Option, aber ich bin nicht sicher, ob DreamWeaver dies akzeptiert. JavaScript hat eine spezielle Regex-Literal-Syntax, sodass Sie nicht zuerst eine Zeichenfolge erstellen müssen. Wenn Sie diesen zusätzlichen Parsing-Schritt überspringen, vermeiden Sie tatsächlich die Notwendigkeit eines doppelten Fluchtens. Ein JS-Regex-Literal hat die Form /pattern/options(Schrägstriche müssen escape sein, aber in diesem Muster gibt es keine). So kann Ihr Muster als ausgedrückt werden /\$(_POST|_SESSION|_GET)\[([^'][0-9a-zA-Z _]+?[^'])\]/. Wieder einmal müssen die einfachen Anführungszeichen überhaupt nicht maskiert werden.

Wenn DreamWeaver die Regex-Literal-Syntax unterstützt, ist dies tatsächlich die bevorzugte Option.

"Sie können Ihre Prämie in 21 Stunden vergeben" - das gebe ich am Morgen :) MrMarlow vor 8 Jahren 0
Gut entdeckt - das habe ich völlig vermisst. AFH vor 8 Jahren 0
Jetzt als beste Antwort ausgewählt - ich würde Sie auch wählen, aber anscheinend brauche ich dafür 15 Ruf, und wenn ich 100 verschenkt, bin ich jetzt um 13 - schlechte Zeiten! MrMarlow vor 8 Jahren 0