Разбор текста исходного кода javascript и заполнение двух массивов

#php #arrays #regex #parsing #preg-match-all

#php #массивы #регулярное выражение #синтаксический анализ #preg-match-all

Вопрос:

Я пытаюсь проанализировать некоторые данные с веб-страницы с помощью 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","");
...
  

Мне нужно заполнить два разных массива ( datetime и temp )

Например, первая строка будет создавать эти элементы:

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

и так далее.

Я действительно новичок в этом с php, и я почти ничего не знаю о синтаксисе шаблонов. То, что я пытаюсь сделать, это что-то вроде этого:

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

Комментарии:

1. * является определителем за пределами квадратных фигурных скобок и буквальной звездочкой внутри квадратных фигурных скобок. Это никогда не означает any character в регулярных выражениях. В вашем вопросе отсутствует точный желаемый результат.

Ответ №1:

  • ^ означает начало строки при 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',
)
  

Если вы хотите игнорировать / деидентифицировать идентификаторы из строк в каждой строке, не фиксируйте идентификатор.

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