使用PHP,如何在源字符串中可靠地识别(查找)已知的Javascript变量名称?

时间:2015-04-17 16:37:25

标签: javascript php regex

假设我有一个PHP字符串,其中包含以下文本,或者其他一些文本,如果放入解释器,则是有效的Javascript代码:

$ js_script PHP变量

var loaded = [];
var loading = [];
var downloading = [];

function load(name)
{
    loading.push(name);
    downloading.push(name);

    // do some asynchronous stuff, with the following callback:
    (function () {
        loaded.push(name);
        downloading = [];
    });
}

我想将变量loading(在整个代码中替换变量名称本身)替换为l1而不使用使用完整的JavaScript解析器,从而产生以下输出:

$ js_script PHP变量

var loaded = [];
var l1 = [];
var downloading = [];

function load(name)
{
    l1.push(name);
    downloading.push(name);

    // do some asynchronous stuff, with the following callback:
    (function () {
        loaded.push(name);
        downloading = [];
    });
}

我认为避免使用解析器的原因是一个不错的选择:

  • 他们似乎极端过度杀害这项单一任务,
  • 这是我希望对输入代码执行的唯一修改
  • 我明确知道我要替换的变量名。

我不关心性能,因为要缓存结果输出。我考虑过使用正则表达式,即使用以下代码在代码字符串中查找“loading”的所有内容:

\bloading\b(?=[^"]*(?:"[^"]*"[^"]*)*$)

......这显然不支持撇号,但除此之外,似乎到目前为止还没有完成任务。

有什么我想念的吗?我知道批发中的JavaScript不是常规语言,但这部分怎么样?我应该忘记使用正则表达式,而是使用解析器吗?

1 个答案:

答案 0 :(得分:0)

如果您使用preg_replace,则非常简单:

$out = preg_replace("/(\W)(loading)(\W)/", "$1l1$3", $in);

可以找到一个示例here

编辑:我做了一个快速的基准测试,并且在你指定的文件上运行一个这样的替换,平均花了我的计算机~2μs(我把基准测试代码here)< / p>