take a look at my following regex: https://regex101.com/r/HMya54/2
I only want to find the javascript-function with "_tsid" in it, not all JavaScript functions, and to replace that whole function by an HTML-Comment <!-- here was my function -->.
I tried something like: /<script.*?>([\s\S]*?)_tsid([\s\S]*?)<\/script>/ but that seems not the right way.
Can you help me with that problem?
Thank you!
The simplest way is to use your current (or its optimized version, see below) and use a callback as the replacement argument where you can check if the match contains the string of your choice, and if it is there, perform the replacement:
let text = '<script type="text/javacript">alert("First one!");</script>\n\n<script>console.log("Hello World");</script>\n\n<script type="text/javascript">\n (function () {\n var _tsid = \'XFE5AF4B9ADDACA0E60017B1BC4D16AE2\';\n _tsConfig = {\n \'yOffset\': \'0\', /* offset from page bottom */\n \'variant\': \'reviews\', /* reviews, default, custom, custom_reviews */\n \'customElementId\': \'\', /* required for variants custom and custom_reviews */\n \'trustcardDirection\': \'\', /* for custom variants: topRight, topLeft, bottomRight, bottomLeft */\n \'customBadgeWidth\': \'\', /* for custom variants: 40 - 90 (in pixels) */\n \'customBadgeHeight\': \'\', /* for custom variants: 40 - 90 (in pixels) */\n \'disableResponsive\': \'false\', /* deactivate responsive behaviour */\n \'disableTrustbadge\': \'false\', /* deactivate Trustbadge® */\n \'responsive\': {\n \'variant\': \'\', /* floating, custom */\n \'customElementId\': \'\' /* required for variant custom */\n }\n };\n var _ts = document.createElement(\'script\');\n _ts.type = \'text/javascript\';\n _ts.charset = \'utf-8\';\n _ts.async = true;\n _ts.src = \'//widgets.trustedshops.com/js/\' + _tsid + \'.js\';\n var __ts = document.getElementsByTagName(\'script\')[0];\n __ts.parentNode.insertBefore(_ts, __ts);\n })();\n</script>';
text = text.replace(/</g, '<').replace(/<script[^>]*>[^<]*(?:<(?!\/?script[\s>])[^<]*)*<\/script>/g, (x) => x.includes("_tsid") ? "<!-- here was my function -->" : x);
console.log(text);
The regex is now /<script[^>]*>[^<]*(?:<(?!\/?script[\s>])[^<]*)*<\/script>/g, it matches <script, anu zero or more chars other than >, then a >, then any zero or more non-< chars, then zero or more sequences of < not followed with an optional / and then script followed with a whitespace or > and then zero or more non-< chars, and then </script>, and then the text containing _tsid only is replaced, else, the match is reinserted into the resulting string.