Найти и выполнить фрагменты Javascript в связке HTML - PullRequest
0 голосов
/ 11 сентября 2009

Мне нужно обнаружить и eval код Javascript, содержащийся в строке.

Следующий код работает, но он оценивает только первое <script>...</script>, которое он находит.

function executeJs(html) {
    var scriptFragment = "<script(.+?)>(.+?)<\/script>";
    match = new RegExp(scriptFragment, "im");
    var matches = html.match(match);
    if (matches.length >= 2) {
        eval(matches[2]);
    }
}

Интересно, есть ли метод, который позволяет мне повторять и выполнять все фрагменты Javascript.

Ответы [ 3 ]

3 голосов
/ 11 сентября 2009

Причина, по которой он занимает только первое, в том, что вы пропускаете флаг 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>');
1 голос
/ 11 сентября 2009

Вот код, который делает то же самое немного другим способом. Вы можете передать строку в функцию, и она оценит все теги сценария и вернет очищенный источник (без сценария). Существует также небольшое различие в способах обработки 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;
   }
0 голосов
/ 11 сентября 2009

Блист должен быть прав ...

Вы также можете взглянуть на функцию прототипа String.evalScripts.

http://api.prototypejs.org/language/string.html#evalscripts-instance_method

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...