用PHP解析Javascript文件以提取其中定义的数组的最佳方法

用PHP解析Javascript文件以提取其中定义的数组的最佳方法,php,javascript,regex,Php,Javascript,Regex,我有一个Javascript文件,它是从一个遗留应用程序自动生成的,该应用程序中定义了一个巨大的数组(以及一些其他函数和东西)。这个javascript文件对内容执行搜索,但随着时间的推移,它已经增长到2Mb以上,这听起来可能不多,但每次你想用这个特定的web应用进行搜索时,都必须下载这个文件。不用说,这场演出太糟糕了。我想要一个简单的方法,在js周围放置一个包装器,这样它就不用在客户端调用js,而是调用我的新php脚本来搜索内容 生成的JS文件的布局在每次生成时都是相同的,因此我可以编写一系列

我有一个Javascript文件,它是从一个遗留应用程序自动生成的,该应用程序中定义了一个巨大的数组(以及一些其他函数和东西)。这个javascript文件对内容执行搜索,但随着时间的推移,它已经增长到2Mb以上,这听起来可能不多,但每次你想用这个特定的web应用进行搜索时,都必须下载这个文件。不用说,这场演出太糟糕了。我想要一个简单的方法,在js周围放置一个包装器,这样它就不用在客户端调用js,而是调用我的新php脚本来搜索内容

生成的JS文件的布局在每次生成时都是相同的,因此我可以编写一系列特定的trim和split,但我当时认为regexp可能是一种方法,但老实说,我不确定,所以我想我会问你们这些可爱的人

样本来源:

Page[0]=new Array("Some text1","More text1","Final Text1","abc.html");
Page[1]=new Array("Some text2","More text2","xyz.html");
如您所见,每个数组行中至少有一个条目,最后一个条目是要搜索的文件的名称

无论如何,问题是,regexp是否是最好的(如果是的话,一些建议的模式会很好)。或者我应该用split来拆分这个,等等


干杯

使用AJAX,完全避免为此解析JS。使用AJAX,您可以轻松地将这些数组发送到PHP文件,详细说明内容并再次将结果返回到JavaScript。

试试看

/Page\[\d\]=new Array\((.*)\);/simU
例子:
使用基于PHP的Javascript解释器(比如)怎么样?

我自己从来没有尝试过,但想法是在服务器端运行js文件,并从内存中读取该数组。这样可以避免regexp和让用户下载js文件。

您正在寻找类似的东西。注意,我将.js文件作为本地文件,所以我使用
file()
将其加载到数组中。对于实际脚本,如果php无法在本地访问.js文件,则可能需要
文件\u get\u contents()

<?php
$lines = file('test.js');

    $pages = array();

    foreach($lines as $line) {
        if(strpos($line, 'new Array') != false) {

            preg_match('/Page\[\d\]\s?\=\s?new Array\((\"(.*)",?\s?\n?)+\);/', $line, $matches);


            $values = preg_split('/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/', $matches[1]);

            $currNo = count($pages);
            $pages[$currNo] = array();

            for($i = 0; $i < count($values); $i++) {
                array_push($pages[$currNo], trim($values[$i], '"'));
            }


        }
    }

    var_dump($pages);

享受吧

我的想法是将JS转换成PHP和
eval()
it。(喘息

只是开玩笑而已。但是,您可以转换为PHP并将其标记化。 我认为在正则表达式变得过于复杂的情况下,这可能会更好

我认为我有正确的解决方案,但显然它将PHP转换为JS(meh;p) 我会在这里尝试一下我自己的小尝试

$js='Page[0]=new Array("Some text1","More text1","Final Text1","abc.html"); '.
    'Page[1]=new Array("Some text2","More text2","xyz.html");';

// Convert JS variable names to PHP (this seems pretty consistent in your app)
$php='<?php '.str_replace('Page[','$Page[',$js);
//      '---PHP tag, tells tokenizer this is PHP code

// Parse the PHP-JS thingy
token_get_all($php);
$js='Page[0]=新数组(“一些文本1”、“更多文本1”、“最终文本1”、“abc.html”);”。
'第[1]页=新数组(“一些文本2”,“更多文本2”,“xyz.html”);';
//将JS变量名转换为PHP(这在应用程序中似乎非常一致)

$php=,这意味着,首先用户下载2MB,然后用户通过Ajax发送相同的2MB。听起来不太聪明,是吗?@Gordon:我可能误解了这个问题,但用PHP解析JavaScript文件更糟糕。。。JSON+AJAX可能是实现它的最佳方式。抱歉,Charlie,我是Gordon的同事,我的想法是避免下载JS文件-我们将从前端的一些非常简单的AJAX调用PHP脚本…如果它已经是JSON格式,我将是一只快乐的兔子,但遗憾的是它不是:(它是上面的格式,在数组前后都有一些额外的文本。我现在正在努力通过regexp来实现这一点,但我大约每12个月只需要做一次regexp,所以我担心它…看起来非常合适,会让你尽快知道这是否成功。是的,成功了,我唯一需要做的更改是s通过在
\d\
之后添加一个
+
,允许方括号之间的值为1或多个数字,因此第一个regexp现在是:
preg\u match('/Page\[\d+\]\s?\=\s?新数组\(\“(*”,?\s?\n?+);/,$line,$matches);
非常感谢Bogdan的帮助:)Doh,忘了添加注释-我不得不做了一些小的调整,但效果很好,Bogdan干杯!:)我希望…这是我名单上的下一场战斗…有时,用包装纸包装坏代码会更容易,一旦它被使用,处理让代码重写的政治…政治,快乐。。。
<?php
$lines = file('test.js');

    $pages = array();

    foreach($lines as $line) {
        if(strpos($line, 'new Array') != false) {

            preg_match('/Page\[\d\]\s?\=\s?new Array\((\"(.*)",?\s?\n?)+\);/', $line, $matches);


            $values = preg_split('/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/', $matches[1]);

            $currNo = count($pages);
            $pages[$currNo] = array();

            for($i = 0; $i < count($values); $i++) {
                array_push($pages[$currNo], trim($values[$i], '"'));
            }


        }
    }

    var_dump($pages);
array(2) {
  [0]=>
  array(4) {
    [0]=>
    string(10) "Some text1"
    [1]=>
    string(10) "More text1"
    [2]=>
    string(11) "Final Text1"
    [3]=>
    string(8) "abc.html"
  }
  [1]=>
  array(3) {
    [0]=>
    string(10) "Some text2"
    [1]=>
    string(10) "More text2"
    [2]=>
    string(8) "xyz.html"
  }
}
$js='Page[0]=new Array("Some text1","More text1","Final Text1","abc.html"); '.
    'Page[1]=new Array("Some text2","More text2","xyz.html");';

// Convert JS variable names to PHP (this seems pretty consistent in your app)
$php='<?php '.str_replace('Page[','$Page[',$js);
//      '---PHP tag, tells tokenizer this is PHP code

// Parse the PHP-JS thingy
token_get_all($php);