在一堆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
标志意味着“全局”,即它应该搜索整个正则表达式。这是一个性能问题,因为有时你可能只需要第一个匹配。