Прег соответствует всем запятым вне фигурных скобок
У меня есть строка:
<b>08-14-2018 09:24:09</b>,192.168.0.1,{"i":"2018-001370","ln":"FIRST","fn":"TEST","a":"570.00","d":"08\/14\/2018 09:23:00","ca":"550.00","ch":"20.00","chi":"s"},{"terapay_response":{"code":-106,"description":"Missing Check Amount Or Check Info"}}
и я хочу сопоставить все запятые за пределами фигурных скобок.
Мой желаемый результат будет:
[0] : <b>08-14-2018 09:24:09</b>
[1] : 192.168.0.1
[2] : {"i":"2018-001370","ln":"FIRST","fn":"TEST","a":"570.00","d":"08\/14\/2018 09:23:00","ca":"550.00","ch":"20.00","chi":"s"}
[3] : {"terapay_response":{"code":-106,"description":"Missing Check Amount Or Check Info"}}
Я старался:
preg_match_all("/\((?:[^{}]|(?R))+\)|[^{},\s]+/", $line, $out);
но вывод другой:
[0] : "<b>08-14-2018"
[1] : "09:24:09</b>"
[2] : "192.168.0.1"
[3] : ""i":"2018-001370""
[4] : ""ln":"FIRST""
[5] : ""fn":"TEST""
[6] : ""a":"570.00""
[7] : ""d":"08\/14\/2018"
[8] : "09:23:00""
[9] : ""ca":"550.00""
[10] : ""ch":"20.00""
[11] : ""chi":"s""
[12] : ""terapay_response":"
[13] : ""code":-106"
[14] : ""description":"Missing"
[15] : "Check"
[16] : "Amount"
[17] : "Or"
[18] : "Check"
[19] : "Info""
Спасибо.
1 ответ
Решение
Вы можете использовать это регулярное выражение:
/,(?![^{]*})/
который найдет ,
который не находится внутри {}
(основываясь на этом ответе) разделить строку с помощью preg_split:
$str = '<b>08-14-2018 09:24:09</b>,192.168.0.1,{"i":"2018-001370","ln":"FIRST","fn":"TEST","a":"570.00","d":"08\/14\/2018 09:23:00","ca":"550.00","ch":"20.00","chi":"s"},{"terapay_response":{"code":-106,"description":"Missing Check Amount Or Check Info"}}';
print_r(preg_split('/,(?![^{]*})/', $str));
Выход:
массив
(
[0] => 08-14-2018 09:24:09
[1] => 192.168.0.1
[2] => {"i":"2018-001370","ln":"FIRST","fn":"TEST","a":"570.00","d":"08\/14\/2018 09:23:00","ca":"550.00","ch":"20.00","chi":"s"}
[3] => {"terapay_response":{"code":-106,"description":"Missing Check Amount Or Check Info"}}
)