首页 > 解决方案 > 解析 javascript 源代码文本并填充两个数组

问题描述

我正在尝试使用 php 解析网页中的一些数据。我拥有的是一个包含以下行的 html 页面:

var VALUES = new Array();
VALUES[0] = new Array("70","09/11/2020 00.00","7.3","");
VALUES[3] = new Array("73","09/11/2020 00.15","7.5","");
VALUES[6] = new Array("75","09/11/2020 00.30","7.4","");
VALUES[9] = new Array("78","09/11/2020 00.45","7.8","");
VALUES[12] = new Array("81","09/11/2020 01.00","8.1","");
...

我需要填充两个不同的数组(datetimetemp

例如,第一行将产生这些元素:

$datetime[0] = "09/11/2020 00.00";
$temp[0] = 7.3;

等等。

我真的是用 php 做这件事的新手,我对模式语法几乎一无所知。我想做的是这样的:

$content=file_get_contents($pageURL);
preg_match('#VALUES[*] = new Array(*)#',$content,$match);

标签: phparraysregexparsingpreg-match-all

解决方案


  • ^表示使用m模式修饰符时的行首(在模式的末尾)。
  • \d用于匹配数字字符。
  • +表示一个或多个上述表达式。
  • *表示前面表达式的零个或多个。
  • (...)是一个捕获组——它们决定了匹配数组中保留的值。
  • 我建议对双引号之间未知的字符使用否定字符类。[^"]

有关更多详细信息,我建议使用 regex101.com 作为沙箱,因为它会在您进行时说明所有内容。

代码:(演示

$content = <<<TEXT
var VALUES = new Array();
VALUES[0] = new Array("70","09/11/2020 00.00","7.3","");
VALUES[3] = new Array("73","09/11/2020 00.15","7.5","");
VALUES[6] = new Array("75","09/11/2020 00.30","7.4","");
VALUES[9] = new Array("78","09/11/2020 00.45","7.8","");
VALUES[12] = new Array("81","09/11/2020 01.00","8.1","");
TEXT;

$datetime = [];
$temp = [];
preg_match_all('~^VALUES\[(\d+)] = new Array\("[^"]*","([^"]*)","([^"]*)"~m', $content, $out, PREG_SET_ORDER);
foreach ($out as $m) {
    $datetime[$m[1]] = $m[2];
    $temp[$m[1]] = $m[3];
}

var_export($datetime);
echo "\n---\n";
var_export($temp);

输出:

array (
  0 => '09/11/2020 00.00',
  3 => '09/11/2020 00.15',
  6 => '09/11/2020 00.30',
  9 => '09/11/2020 00.45',
  12 => '09/11/2020 01.00',
)
---
array (
  0 => '7.3',
  3 => '7.5',
  6 => '7.4',
  9 => '7.8',
  12 => '8.1',
)

如果您想忽略/取消识别每行中的行中的 id,请不要捕获 id。

preg_match_all('~^VALUES\[\d+] = new Array\("[^"]*","([^"]*)","([^"]*)"~m', $content, $out, PREG_SET_ORDER);
foreach ($out as $m) {
    $datetime[] = $m[1];
    $temp[] = $m[2];
}

推荐阅读