在一堆HTML中查找并执行Javascript片段

在一堆HTML中查找并执行Javascript片段,javascript,regex,Javascript,Regex,我需要检测并eval字符串中包含的Javascript代码 下面的代码可以工作,但它只计算它找到的第一个… function executeJs(html) { var scriptFragment = "<script(.+?)>(.+?)<\/script>"; match = new RegExp(scriptFragment, "im"); var matches = html.match(match); if (matches.l

我需要检测并
eval
字符串中包含的Javascript代码

下面的代码可以工作,但它只计算它找到的第一个

function executeJs(html) {
    var scriptFragment = "<script(.+?)>(.+?)<\/script>";
    match = new RegExp(scriptFragment, "im");
    var matches = html.match(match);
    if (matches.length >= 2) {
        eval(matches[2]);
    }
}
函数executeJs(html){
var scriptFragment=“(.+?)”;
match=newregexp(scriptFragment,“im”);
var matches=html.match(匹配);
如果(matches.length>=2){
评估(匹配[2]);
}
}

我想知道是否有一种方法允许我迭代并执行所有Javascript片段。

之所以只使用第一个片段,是因为缺少
g
标志。试试这个:

function executeJs(html) {
    var scriptFragment = '<script(.*?)>(.+?)<\/script>';
    var re = new RegExp(scriptFragment, 'gim'), match;
    while ((match = re.exec(html)) != null) {
        eval(match[2]);
    }
}

executeJs('<script>alert("hello")</script>abc<script>alert("world")</script>');
函数executeJs(html){
var scriptFragment='(.+?)';
var re=new RegExp(scriptFragment,'gim'),匹配;
而((match=re.exec(html))!=null){
评估(匹配[2]);
}
}
executeJs(“警报(“你好”)abcalert(“世界”));

只取第一个的原因是缺少
g
标志。试试这个:

function executeJs(html) {
    var scriptFragment = '<script(.*?)>(.+?)<\/script>';
    var re = new RegExp(scriptFragment, 'gim'), match;
    while ((match = re.exec(html)) != null) {
        eval(match[2]);
    }
}

executeJs('<script>alert("hello")</script>abc<script>alert("world")</script>');
函数executeJs(html){
var scriptFragment='(.+?)';
var re=new RegExp(scriptFragment,'gim'),匹配;
而((match=re.exec(html))!=null){
评估(匹配[2]);
}
}
executeJs(“警报(“你好”)abcalert(“世界”));

以下是一些代码,它们以稍微不同的方式完成相同的任务。您可以将字符串传递给函数,它将评估所有脚本标记并返回已清理的源代码(不带脚本)。IE处理它的方式也有一点不同,代码中也有,您可以根据自己的需求调整它。此外,经过计算的代码具有全局上下文。希望能有帮助

function parseScript(_source)
{
      var source = _source;
      var scripts = new Array();

      // Strip out tags
      while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1)
  {
         var s = source.indexOf("<script");
         var s_e = source.indexOf(">", s);
         var e = source.indexOf("</script", s);
         var e_e = source.indexOf(">", e);

         // Add to scripts array
         scripts.push(source.substring(s_e+1, e));
         // Strip from source
         source = source.substring(0, s) + source.substring(e_e+1);
      }

      // Loop through every script collected and eval it
      for(var i=0; i<scripts.length; i++)
  {
         try
      {
             //eval(scripts[i]);
             if(window.execScript)
             {
               window.execScript(scripts[i]); // IE
       }
       else
       {
               window.setTimeout(scripts[i],0); // Changed this from eval() to setTimeout() to get it in Global scope
             }
            }
         catch(ex)
      {
             // do what you want here when a script fails
             alert("Javascript Handler failed interpretation. Even I am wondering why(?)");
            }
      }
      // Return the cleaned source
      return source;
   }
函数解析脚本(\u源代码)
{
变量源=_源;
var scripts=newarray();
//去掉标签

while(source.indexOf(“这里有一些代码以稍微不同的方式执行相同的操作。您可以将字符串传递给函数,它将评估所有脚本标记并返回清理过的源代码(不带脚本)。IE处理它的方式也有一点不同,即在代码中也有处理,您可以根据自己的需求进行调整。此外,评估的代码具有全局上下文。希望能有所帮助

function parseScript(_source)
{
      var source = _source;
      var scripts = new Array();

      // Strip out tags
      while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1)
  {
         var s = source.indexOf("<script");
         var s_e = source.indexOf(">", s);
         var e = source.indexOf("</script", s);
         var e_e = source.indexOf(">", e);

         // Add to scripts array
         scripts.push(source.substring(s_e+1, e));
         // Strip from source
         source = source.substring(0, s) + source.substring(e_e+1);
      }

      // Loop through every script collected and eval it
      for(var i=0; i<scripts.length; i++)
  {
         try
      {
             //eval(scripts[i]);
             if(window.execScript)
             {
               window.execScript(scripts[i]); // IE
       }
       else
       {
               window.setTimeout(scripts[i],0); // Changed this from eval() to setTimeout() to get it in Global scope
             }
            }
         catch(ex)
      {
             // do what you want here when a script fails
             alert("Javascript Handler failed interpretation. Even I am wondering why(?)");
            }
      }
      // Return the cleaned source
      return source;
   }
函数解析脚本(\u源代码)
{
变量源=_源;
var scripts=newarray();
//去掉标签

而(source.indexOf(“blix)应该是正确的

您还可以查看prototype的String.evalscript函数


b文本应该是正确的

您还可以查看prototype的String.evalscript函数


+1:比使用正则表达式更有效,而且它维护了执行代码的全局范围。感谢Blix,我大约在一年前为一个最终消亡的应用程序编写了这段代码,这解释了为什么一些代码时注释仍然存在。:)+1:比使用正则表达式更有效,而且它维护了执行代码的全局范围。感谢Blixt,我大约在一年前为一个最终消亡的应用程序编写了这段代码,这解释了为什么一些代码时注释仍然存在的原因。:)谢谢。它有效!我尝试了“exec”没有成功,因为我丢失了g标志。如果你不介意的话,还有一个问题,“g”标志是什么意思?
g
标志意味着“全局”,即它应该搜索整个正则表达式。这是一个性能问题,因为有时你可能只需要第一个匹配。谢谢。它有效!我尝试了“exec”没有成功,因为我缺少了g标志。如果你不介意的话,还有一个问题,“g”标志是什么意思?
g
标志意味着“全局”,即它应该搜索整个正则表达式。这是一个性能问题,因为有时你可能只需要第一个匹配。