#php #regex #dictionary #parsing #tcl
Вопрос:
После действительно долгих исследований никакого решения найдено не было. Так что stackoverflow-моя последняя надежда.
В PHP мне нужен парсер для получения данных из базы данных PostgreSQL.
Строковая конструкция выглядит так:
"keytext {this is my value text 1} key with multi words {value text 2} another key {key_value number 3}"
Таким образом, у нас есть ключ (может состоять из нескольких слов) и значение в фигурных скобках.
Я думаю, что этот тип данных происходит из TCL.
Как мы можем преобразовать эту строку в JSON-строку или массив в PHP 7/8 ??
БОЛЬШОЕ вам СПАСИБО ЗА то, что пытались мне помочь!.
Обновить:
О боже, я нашел второе условие, которое значительно усложняет преобразование TCL dict в формат JSON:
user_receiver {all} manifest 3200 transferCode {B45} time hours 0 status {1a} local {} is online {}
Как вы можете видеть, в строке есть числовые значения, которые не заключены в фигурные скобки.
-> строковые значения заключены в фигурные скобки
-> числовые значения не являются
Итак, кто-нибудь знает, как использовать РЕГУЛЯРНОЕ выражение для чего-либо еще, чтобы получить пары значений ключей?
Комментарии:
1. Это выглядит немного маловероятно.
keytext {this is my value text 1} {key with multi words} {value text 2} {another key} {key_value number 3}
будет ожидаемой версией…2. Как должен выглядеть ожидаемый результат («строка JSON»?) похож?
3. Это формат словаря TCL, и он должен быть преобразован в стандартный json.
Ответ №1:
Это не идеальный способ, но это работа.
$string = "keytext {this is my value text 1} key with multi words {value text 2} another key {key_value number 3}";
$results = explode('{', $string);
$newArray = $values = [];
foreach ($results as $result){
if (strpos($result, '}') !== false) {
$values[] = explode('}', $result)[0];
$keys[] = explode('}', $result)[1];
} else {
$keys[] = $resu<
}
}
$newArray = [];
foreach ($keys as $index => $key) {
if ($key !== '' amp;amp; isset($values[$index])){
$newArray[$key] = $values[$index];
}
}
return $newArray;
Комментарии:
1. Спасибо. Я попробую это сделать.
2. Хорошо, как я это проверил — похоже, это работает. Но я не могу сказать, что на 100% он будет работать надежно, потому что странные вещи, такие как фигурные скобки в значении и т. Д., Могут создать проблемы. То же самое касается специальных символов.
Ответ №2:
Зацени это
$str = "keytext {this is my value text 1} key with multi words {value text 2} another key {key_value number 3}";
$chars = str_split($str);
$result_arr = [];
$make_arr_key = true;
$make_arr_key_val = false;
$arr_key = '';
$arr_key_val = '';
foreach ($chars as $char) {
if($char == '{') {
$make_arr_key = false;
$arr_key_val = '';
$make_arr_key_val = true;
}
if($char == '}') {
$result_arr[trim($arr_key)] = trim($arr_key_val);
$arr_key = '';
$make_arr_key = true;
$make_arr_key_val = false;
}
if($make_arr_key) {
if($char != '}'){
$arr_key .= $char;
}
}
if($make_arr_key_val) {
if($char != '{') {
$arr_key_val .= $char;
}
}
}
print_r($result_arr);
Выход:
Комментарии:
1. Спасибо. Я попробую это сделать. Надеюсь, надежная версия.