Tach!
....und wenn wir mal jetzt wieder weggehen vom Logisitker und von den Paletten und es ganz konkret an dem Beispielcode festmachen? :-) Vielleicht ist es ja dann doch auch für andere "Nicht so tief drin Experten" ersichtlicher?
Es kommt auf den Kontext an, in dem man sich befindet, um ein Stück Code korrekt zu interpretieren. Wenn du ein Stück Code aus seinem Kontext herausnimmst, und es irgendwo anders einfügst, kommt es damit auch in einem anderen Kontext zu liegen. Wenn ich es nun gemäß diesem neuen Kontext interpretiere, kommt vermutlich nicht mehr das raus, was rauskäme, wenn ich es nach den Regeln des alten läse. Wenn der Javascript-Code als String in PHP stünde, kämen noch mehr Maskierungen hinzu. Wenn du dann den PHP-Teil wegließest, sehe ich zu viele Maskierungzeichen, die sonst von PHP vertilgt werden würden, bevor das Javascript sie zu Gesicht bekommt. Das nur mal am Rande, denn diese Problematik liegt hier nicht vor.
new RegExp("[\\\\/:\*\?\"<>\|]")
Ich sehe hier einen Stringanfang ". Dann kommt (die Klammer ignorierend) ein , welches dem folgenden Zeichen eine besondere Bedeutung gibt. Das folgende \ heißt in dem Fall, dass genau ein \ wörtlich gemeint ist. Die zwei \\
fallen damit zu einem \ zusammen. Mit den nächsten beiden passiert dasselbe. Der entstehende String ist also letztlich [\\/:*?"<>|]
Die anderen Backslashes hab ich jetzt mal stillschweigend weginterpretiert. Bis auf das vor dem " waren sie jedoch alle überflüssig. Vor dem " wird ein \ benötigt, damit nicht schon dort das Ende des mit " eingeleiteten Strings erkannt wird.
Der entstandene String wird nun von Javascript an die Reg-Ex-Maschine weitergereicht und von dieser auch nochmal interpretiert. Sie hat dabei ihre eigenen Regeln, in denen der \ auch wieder als Maskierungszeichen verwendet wird. Ein wörltich gemeinter \ muss als \\
notiert werden. Die Regex-Maschine liest also am Ende [\/:*?"<>|]
was eine Zeichenklasse mit ein paar Zeichen darin darstellt.
replace(/[\\\/:*\?"<>|]/g, '')
Der Kontext hier ist etwas anders, der reguläre Ausdruck ist als Regex-Literal geschrieben und steht als solcher direkt im Code und nicht in einem Javascript-String-Literal wie oben.
Ein Regex-Literal wird von je einem / eingerahmt. Kommt ein / im Ausdruck selbst vor, muss der maskiert werden. Die ersten beiden \\
ergeben einen wörtlichen , der nächste \ maskiert den Slash /, damit nicht schon dort das Ende des Regex-Literals erkannt wird. Der \ vor dem ? ist wieder überflüssig, weil wir uns in einer Zeichenklasse befinden, eingerahmt durch [ und ]. Außerhalb der Zeichenklasse wäre der \ notwendig, wenn ein literales ? gemeint ist.
dedlfix.