Odstranění všech značek skriptu z html pomocí regulárního výrazu JS

Chci odstranit značky skriptu z tohoto HTML na Pastebin:

http://pastebin.com/mdxygM0a

Zkusil jsem použít níže uvedený regulární výraz:

html.replace(/<script.*>.*</script>/ims, " ")

Ale neodstraní všechny značky skriptu v HTML. Odstraní pouze vložené skripty. Hledám nějaký regulární výraz, který dokáže odstranit všechny značky skriptu (in-line a multi-line). Bylo by velmi oceněno, kdyby byl test proveden na mém vzorku http://pastebin.com/mdxygM0a

Odpověď

Pokus o odstranění značky HTML pomocí regulárního výrazu je problematický. Nevíte, co tam je jako hodnoty skriptu nebo atributu. Jedním ze způsobů je vložit jej jako innerHTML prvku div, odstranit všechny prvky skriptu a vrátit innerHTML, např.

  function stripScripts(s) {
    var div = document.createElement('div');
    div.innerHTML = s;
    var scripts = div.getElementsByTagName('script');
    var i = scripts.length;
    while (i--) {
      scripts[i].parentNode.removeChild(scripts[i]);
    }
    return div.innerHTML;
  }

alert(
 stripScripts('<span><script type="text/javascript">alert('foo');</script></span>')
);

Všimněte si, že v současné době prohlížeče neprovedou skript, pokud je vložen pomocí vlastnosti innerHTML, a pravděpodobně nikdy nespustí, zejména proto, že prvek není přidán do dokumentu.