#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];
}