0

我正在开发使用 Ajax 请求加载 HTML 页面的 javascript 新插件,从页面中提取所有脚本,然后在加载所有内容后执行它。为此,我正在尝试类似的方法:

var scripts = '',
    domResponse = $('<div/>').append(HTMLresponse
        .replace(/<\s*script\s*([^>]*)>((.|\n)*)<\s*\/\s*script>/i, function($0,$1,$2){
            scripts += $2;
            return '';
        }));
// Then I load the content and I execute scripts

当我尝试使用包含单个脚本标记的页面时,它可以正常工作,但是如果我尝试使用如下页面:

<script>
   // Some javascript
</script>

<!-- SOME HTML -->

<script>
   // Another script
</script>

domResponse 为空,脚本包含第一个 <script> 和最后一个 </script> 之间的文本。

有什么解决方案可以让它正常工作吗?

4

2 回答 2

3

如果我了解您要做什么,这会起作用吗?

var scriptElements = document.getElementsByTagName("script");
var scripts = "";

for(var i = 0; len = scriptElements.length; i < len; i++) {
    scripts += scriptElements[i].innerHTML;
    scriptElements[i].innerHTML = "";
}

// load content and execute scripts
于 2012-05-10T16:10:43.227 回答
0

像其他人一样,我建议不要将正则表达式用于任何与 HTML 相关的内容。

但是,忽略这一点,我仍然可以回答您的问题。你的问题是你正在使用一个贪婪的量词,即,它尽可能多地(.|\n)*“吃” ,只要它以 . 结尾。你想要的是一个非贪婪的量词,像这样:</script>

<\s*script\s*([^>]*)>((.|\n)*?)<\s*\/\s*script>

见这里:http ://rubular.com/r/U2vvOW6XfZ 。

请注意,如果脚本标记中的任何属性包含>; ,则正则表达式将中断。如果脚本出于某种原因</script>在其中包含 a (可能在评论中);如果页面通常注释掉了一个脚本;等等。这就是为什么使用解析器要好得多的原因。

于 2012-05-10T20:12:09.783 回答