我有一个 Javascript 文件,它是从旧版应用程序自动生成的,该应用程序中定义了一个巨大的数组(以及一些其他函数和内容)。这个 javascript 文件对内容执行搜索,但随着时间的推移,它已经增长到超过 2Mb,这听起来可能并不多,但每次你想使用这个特定的网络应用程序进行搜索时,你都必须下载这个文件。不用说表演是残酷的。我想要一种在 js 周围放置包装器的最小工作方式,这样它就不会在客户端调用 js,而是调用我的新 php 脚本来搜索内容。
每次生成的 JS 文件的布局都是一样的,所以我可以写一堆特定的 trim 和拆分,但后来我想 regexp 可能是要走的路,但老实说我不确定,所以我想我会问问你们这些可爱的人。
样本来源:
Page[0]=new Array("Some text1","More text1","Final Text1","abc.html");
Page[1]=new Array("Some text2","More text2","xyz.html");
如您所见,数组的每一行中至少有一个条目,最后一个条目是要搜索的文件的名称。
无论如何,问题是正则表达式是否最好(如果是这样,一些建议的模式会很棒)。或者我是否应该用 split 等来拆分它。
干杯
最佳答案
您正在寻找这样的东西。请注意,我将 .js 文件作为本地文件,因此我使用 file()
将其加载到数组中。对于您的实际脚本,如果您的 php 无法在本地访问 .js 文件,您可能需要 file_get_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);
对于您的示例,结果如下:
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"
}
}
尽情享受吧!
关于php - 在 PHP 中解析 Javascript 文件以提取其中定义的数组的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5699398/