var ex = /(<script\s?[^>]*>)([\s\S]*)(<\/script>)/;
//Note: here is 2 script tags
var str = '<script>\nvar x=0;\n</script>\n<div>\nhtml\n</div>\n<script>var y=0;\n</script>'
str.replace(ex, function(full, prefix, script, suffix) {
return prefix + doSomething(script) + suffix;
})
But I got wrong script: var x=0;</script><div>..</div><script>var y=0;
What I want is: var x=0;
and var y=0;
var ex = /(<script\s?[^>]*>)([\s\S]*)(<\/script>)/;
//Note: here is 2 script tags
var str = '<script>\nvar x=0;\n</script>\n<div>\nhtml\n</div>\n<script>var y=0;\n</script>'
str.replace(ex, function(full, prefix, script, suffix) {
return prefix + doSomething(script) + suffix;
})
But I got wrong script: var x=0;</script><div>..</div><script>var y=0;
What I want is: var x=0;
and var y=0;
2 Answers
Reset to default 20Use regex like below:
<script>([\s\S]*?)</script>
In Javascript we cannot make .
dotall so we use the [\s\S] character class which matches any character either whitespace or not whitespace including newline. ?
is for non-greedy match so that you don't nest script tags.
This function matches SCRIPT
elements contents and returns the strings in an array:
// Return an array of <script> elements contents.
function getScriptsConntents(text) {
var scripts = [];
var m;
var re = /<script[^>]*>([\s\S]*?)<\/script>/ig;
while (m = re.exec(text)) {
scripts.push(m[1]);
}
return scripts;
}