在Javascript中从多个HTML标记中提取和替换内容

时间:2012-05-10 16:07:30

标签: javascript html regex

我正在使用javascript中的新插件,使用Ajax请求加载HTML页面,从页面中提取所有脚本,然后在加载所有内容后执行它。要做到这一点,我正在尝试这样的事情:

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为空,脚本包含第一个&lt; script&gt;之间的文本。和最后一个&lt; / script&gt;。

是否有任何解决方案可以使其正常工作?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

与其他人一样,我建议不要使用正则表达式来处理任何与HTML相关的内容。

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

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

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

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