Простое решение вашей проблемы - использовать модификатор шаблона s
, чтобы подать команду .
(любой символ), чтобы она также соответствовала символам новой строки, чего по умолчанию нет.
И выследует:
- экранировать ваши буквальные точки.
- написать
\{
за пределами вашей группы захвата. - опустить модификатор шаблона
m
, потому что вы не 't с помощью якорей.
... НО ...
Если бы это было моей задачей, и я собирался обрабатывать данные из извлеченной строки, я бы, вероятно, начал ломатьдо компонентов во время извлечения с силой \G
.
Код: ( Демо ) ( Pattern Demo )
$htmls[] = <<<HTML
DATA.tracking.user = { age: "19", name: "John doe", int: 55 } // This works
HTML;
$htmls[] = <<<HTML
DATA.tracking.user = {
age: "20",
name: "Jane Doe",
int: 49
} // This does not works
HTML;
foreach ($htmls as $html) {
var_export(preg_match_all('~(?:\G(?!^),|DATA\.tracking\.user = \{)\s+([^:]+): (\d+|"[^"]*")~', $html, $out, PREG_SET_ORDER) ? $out : []);
echo "\n --- \n";
}
Вывод:
array (
0 =>
array (
0 => 'DATA.tracking.user = { age: "19"',
1 => 'age',
2 => '"19"',
),
1 =>
array (
0 => ', name: "John doe"',
1 => 'name',
2 => '"John doe"',
),
2 =>
array (
0 => ', int: 55',
1 => 'int',
2 => '55',
),
)
---
array (
0 =>
array (
0 => 'DATA.tracking.user = {
age: "20"',
1 => 'age',
2 => '"20"',
),
1 =>
array (
0 => ',
name: "Jane Doe"',
1 => 'name',
2 => '"Jane Doe"',
),
2 =>
array (
0 => ',
int: 49',
1 => 'int',
2 => '49',
),
)
---
Теперь вы можете просто повторять совпадения и работать с [1]
(ключи) и [2]
(значения).Это базовое решение, которое может быть дополнительно адаптировано к данным вашего проекта.Следует признать, что это не учитывает значения, которые содержат экранированные двойные кавычки.Добавление этой функции не составит труда.Учет более сложных типов значений может быть более сложной задачей.