hallo
Tach!
Dazu müsste der Platzhalter den Kontext kennen, in dem er sich befindet. htmlspecialchars() ist ja nicht für alle Kontexte eines HTML-Dokuments geeignet, mitunter muss man mehrere Maskierungen schachteln.
Natürlich. Die Frage ist nur wann. Es braucht hier nicht interessieren, dass $var1 Javascript ist. Und das javascript muss nichts wissen über den Kontxt in den es eingesetzt wird.
sprintf('<button onclick="%s">%s</button>', htmlspecialchars($var1), htmlspecialchars($var2));
In diesem einfachen Beispiel ist das noch kein Problem. Aber nimm mal eine URL in einem A-Element. Da wäre es theoretisch schon wie folgt. Praktisch kann man das htmlspecialchars() in dem Fall weglassen, weil rawurlencode() keine HTML-spezifischen Zeichen übriglässt.
sprintf('<a href="http://example.com/%s">%s</a>', htmlspecialchars(rawurlencode($var1)), htmlspecialchars($var2));
Aber du kannst doch gnz klar die Behandlung vorschreiben.
Nehmen wir ein nicht triviales Beispiel
sprintf('<h%d>%s</h>', $header_level, htmlspecialcharsORNOT($var2,$boolean));
Eierlegende Wollmilchsäue... hier bedeutet Kontext viel mehr. Offensichtlich muss da einiges an Wissen über die übergeodnete Anwendung einfliessen und für den Fall, dass der Inhalt von $var2 auch html enthalten soll, braucht es eine Überprüfung nach dem html header Modell.
Meine Antwort lautet da: man vermeide eierlegende Wollmilchsäue.