Конвертер PHP-парсера для словаря Tcl в JSON или МАССИВ

#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. Спасибо. Я попробую это сделать. Надеюсь, надежная версия.