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

时间:2013-11-21 22:06:29

标签: javascript php regex

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

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

这里我要删除func2(它类似于向js控制台输出内容的日志功能)。

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

如果你认为有另一种方法,我会很高兴听到你的。

备注

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

2 个答案:

答案 0 :(得分:2)

如果您希望全局功能“func2”完全消失,您可以确保您的页面以:

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

如果代码依赖于现有功能,您可以这样做:

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

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

在任何情况下,尝试编写“编辑”某些JavaScript代码的代码最终会变得非常脆弱,或者涉及完整的JavaScript解析器的项目。对于与自身存在争议的服务器应用程序而言,某些事情听起来不正常。

答案 1 :(得分:2)

执行此操作的基本正则表达式是:

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

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

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

作为模式(不要忘记逃避你使用的引用)