所有<script>标记</script>之间的Javascript正则表达式

时间:2012-06-04 12:40:26

标签: javascript regex

我想创建一个函数来获取包含脚本标记的html代码(作为字符串)的字符串 - 例如:“<div>dkjdg</div><script>blabla</script>fgfgh<span>hey</span>”并返回脚本标记内的所有脚本,包括打开和关闭标签

到目前为止我试过这个:

var s;
function(string)
{
    var a = string.toLowerCase().match("/(.*?)<script>(.*?)<//script>(.*?)/");
    s = a[2];
    return a[1]+a[3];
}

s包含脚本标记之间的内容,返回是其他所有内容。

但它不起作用......

4 个答案:

答案 0 :(得分:2)

如果块看起来像这样会发生什么?

<script type="text/javascript"><![CDATA[
  alert('hello </script>');
]]></script>

永远不要使用正则表达式解析HTML。相反,你可以做这样的事情(在jQuery的帮助下):

function GetScript(str) {
  var div = $('<div>'), tmpdiv = $('<div>'), scr, ret = '<script';
  div[0].innerHTML = str;
  scr = div.find('script');

  for ( var i = 0; i < scr[0].attributes.length; i++ ) {
    var attr = scr[0].attributes[i];

    if ( attr.value && attr.value != '' )
      ret += ' ' + attr.name + '="' + 
             tmpdiv.text(attr.value).html().replace(/"/g, '&quot;') +
             '"';
  }

  return ret + '>' + scr.text() + '</script>';
}

这将完全符合您的要求,除非输入完全搞砸并且或多或少100%跨浏览器兼容,否则不会中断。请注意,我们不想使用jQuery的.html()来设置div内容,因为这将eval()块!

此:

GetScript("<div>dkjdg</div><script type='yadda\"yadda'>blabla</script>fgfgh<span>hey</span>")

将返回

'<script type="yadda&quot;yadda">blabla</script>'

答案 1 :(得分:1)

你需要

a)给函数一个名字
b)在脚本标签中转义斜杠 c)逃避正则表达式中的斜线 d)从正则表达式中删除引号 e)将标签包括在支架中 f)不使用正则表达式来解析其他地方提到的html

这个更好DEMO

var str = "<div>dkjdg</div><script>blabla<\/script>fgfgh<span>hey</span>"
var s;
function parseIt(string)
{
    var a = string.toLowerCase().match(/(.*?)(<script>.*?<\/script>)(.*)/);
    s = a[2];
    return a[1]+a[3];
}
var rest = parseIt(str);
document.write("s:<xm"+"p>"+s+"</xmp><hr/>")    
document.write("rest:<xm"+"p>"+rest+"</xmp><hr/>")  

答案 2 :(得分:0)

至少你正在寻找<//script>,因为你写错了。

答案 3 :(得分:0)

因为你想拥有一个包含它及其子元素的标签。你应该有一个类似的代码。

var s = "<div>dkjdg</div><script>blabla</script>fgfgh<span>hey</span>";
function getTagContent(string,tag)
{
    var regex = new RegExp("<"+tag+">"+"(.*)"+"<\/"+tag+">");
    return string.match(regex)[0];
}
alert(getTagContent(s,"script"));