使用PHP动态删除javascript代码中的函数调用

Remove function calls from javascript code dynamically using PHP

本文关键字:函数调用 代码 javascript PHP 动态 删除 使用      更新时间:2023-09-26

我想在运行时使用php从javascript源代码中删除一个无效的特定函数(不返回任何内容)。考虑以下js代码,它应该由php输出:

var a = func1(x1);
func2(a + ": " + x1);
// other codes
func2(someOther("Lol") + x1);
// other codes

这里我想删除func2(它有点像一个日志函数,它向js控制台输出一些东西)。

现在,我想到的第一件事是编写一个正则表达式,并使用preg_replace将其替换为空字符串。但我没有成功地定义正确的表达方式。我想知道是否可以编写一个正则表达式来匹配函数调用?如果是的话,你能给我一些提示或例子吗?这样我就可以使用它了?

如果你认为还有另一种方法,我很乐意听听你的意见。

票据

  • 该函数不用于复杂的结构,如if条件等。(我的意思是,您不需要考虑这些情况)
  • 可以调用该函数中的其他函数(作为参数)
  • 我不能更改js代码。(由其他人提交)

如果你想让全局函数"func2"完全消失,你可以确保你的页面以:结束

<script> window.func2 = undefined; </script>

如果有依赖于现有函数的代码,您可以执行:

<script> window.func2 = function() {}; </script>

现在,假设函数是以某种正常的方式定义的,并且您放在正文末尾的代码将在最初定义函数的代码运行后运行。如果函数是由更动态的东西定义的,那么事情就会变得更复杂。

无论如何,试图编写"编辑"某些JavaScript代码的代码最终要么极其脆弱,要么是一个涉及完整JavaScript解析器的项目。服务器应用程序本身存在争论,这听起来有些不正常。

实现这一点的基本正则表达式是:

$result = preg_replace('~'bfunc2's*('((?>[^()]++|(?1))*'));?~', '', $code);

但是:它不处理引号中的括号。要做到这一点,您必须使用:

~'bfunc2's*('((?>[^()"']++|"(?>[^"'']++|''{2}|''.)*"|'(?>[^''']++|''{2}|''.)*'|(?1))*'));?~s

作为模式(不要忘记转义您使用的引号)