更改 javascript 文件中的硬编码 ID
Change hardcoded ids in javascript file
每次调用特定函数时,我都必须解析一个 javascript 文件并替换最后一个函数参数。我有一组替换值来提供新的 ID。
Javascript代码:
// every time this function is called I need to replace change_id with different value from array
function submitData(element_id, url, change_id) {...
...
}
...
// I want to replace 3, 2 and 4 with values from my array
// 3,2,4 are just used for example, values are dynamic
window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 3");}); window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 2");}); window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 4");});
我有一个 ID 数组,我想遍历它们并将每个函数调用中的值替换为该数组中的一个值
我的阵列:
$change_ids = [10,15,20];
所以结果应该是:
window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 10");}); window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 15");}); window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 20");});
只有函数调用中的第三个参数需要改变,所以我想使用这样的东西(找到here):
$search = "/[^metrics,](.*)[^\"\)]/";
$replace = "10";
$string = file_get_contents($pathToJsFile);
echo preg_replace($search,$replace,$string);
但问题是$change_id
在每个函数调用中都是相等的
我最终得到了这个解决方案:
$javascript = file_get_contents($path);
if (empty($javascript)) {
return false;
}
$search = '/(?<=metrics\",)\s*.*?(?=\))/';
此模式将从以下字符串中 return“1”(空格 1):
window.addEventListener('beforeunload', function (e) { submitData(1,
"http://mysite/metrics", 1);});
之后,我用数组中的值替换匹配项。
$javascript = preg_replace_callback($search,function($m) use (&$change_ids) {
$m = $m[key($m)];
$m = ' '. array_shift($change_ids);
return $m;
},$javascript);
return file_put_contents($path, $javascript);
您 可以 通过将 javascript 字符串转换为带有 %d
占位符的“模板”来避免本机函数调用,然后只需注入您的新 ID使用 vsprintf()
进入那些占位符(我将使用 vprintf()
进行演示,以便将字符串打印到屏幕上)。
代码:(Demo)
$string = <<<JS
function submitData(element_id, url, change_id) {...
...
}
...
window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 3");}); window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 2");}); window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 4");});
JS;
$change_ids = [19, 7, 11];
vprintf(
preg_replace('~metrics,\s*\K\d+~', '%d', $string),
$change_ids
);
每次调用特定函数时,我都必须解析一个 javascript 文件并替换最后一个函数参数。我有一组替换值来提供新的 ID。
Javascript代码:
// every time this function is called I need to replace change_id with different value from array
function submitData(element_id, url, change_id) {...
...
}
...
// I want to replace 3, 2 and 4 with values from my array
// 3,2,4 are just used for example, values are dynamic
window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 3");}); window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 2");}); window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 4");});
我有一个 ID 数组,我想遍历它们并将每个函数调用中的值替换为该数组中的一个值
我的阵列:
$change_ids = [10,15,20];
所以结果应该是:
window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 10");}); window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 15");}); window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 20");});
只有函数调用中的第三个参数需要改变,所以我想使用这样的东西(找到here):
$search = "/[^metrics,](.*)[^\"\)]/";
$replace = "10";
$string = file_get_contents($pathToJsFile);
echo preg_replace($search,$replace,$string);
但问题是$change_id
在每个函数调用中都是相等的
我最终得到了这个解决方案:
$javascript = file_get_contents($path);
if (empty($javascript)) {
return false;
}
$search = '/(?<=metrics\",)\s*.*?(?=\))/';
此模式将从以下字符串中 return“1”(空格 1):
window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics", 1);});
之后,我用数组中的值替换匹配项。
$javascript = preg_replace_callback($search,function($m) use (&$change_ids) {
$m = $m[key($m)];
$m = ' '. array_shift($change_ids);
return $m;
},$javascript);
return file_put_contents($path, $javascript);
您 可以 通过将 javascript 字符串转换为带有 %d
占位符的“模板”来避免本机函数调用,然后只需注入您的新 ID使用 vsprintf()
进入那些占位符(我将使用 vprintf()
进行演示,以便将字符串打印到屏幕上)。
代码:(Demo)
$string = <<<JS
function submitData(element_id, url, change_id) {...
...
}
...
window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 3");}); window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 2");}); window.addEventListener('beforeunload', function (e) { submitData(1, "http://mysite/metrics, 4");});
JS;
$change_ids = [19, 7, 11];
vprintf(
preg_replace('~metrics,\s*\K\d+~', '%d', $string),
$change_ids
);