Разбор (нестандартный) json для массива / объекта

У меня есть строка, как это:

['key1':'value1', 2:'value2', 3:$var, 4:'with\' quotes', 5:'with, comma']

И я хочу преобразовать его в массив следующим образом:

$parsed = [
'key1' => 'value1',
2      => 'value2',
3      => '$var',
4      => 'with\' quotes',
5      => 'with, comma',
];

Как я могу разобрать это?
Любые советы или коды будут оценены.

Что нельзя сделать?

  • Использование стандартных парсеров json
  • Eval ()
  • взорваться () , и взорваться () :

-2

Решение

Поскольку вы не можете использовать никакую предварительно созданную функцию, такую ​​как json_decode, вам придется попытаться найти наиболее возможные сценарии цитирования и заменить их известными подстроками.

При условии все значений и / или ключей во входном массиве заключены в одинарные кавычки:

Пожалуйста, обратите внимание: этот код не проверен

<?php
$input = "[ 'key1':'value1', 2:'value2', 3:$var, 4:'with\' quotes', 5: '$var', 'another_key': 'something not usual, like \'this\'' ]";

function extractKeysAndValuesFromNonStandardKeyValueString ( $string ) {

$input = str_replace ( Array ( "\\\'", "\'" ), Array ( "[DOUBLE_QUOTE]", "[QUOTE]" ), $string );
$input_clone = $input;

$return_array = Array ();

if ( preg_match_all ( '/\'?([^\':]+)\'?\s*\:\s*\'([^\']+)\'\s*,?\s*/', $input, $matches ) ) {

foreach ( $matches[0] as $i => $full_match ) {

$key = $matches[1][$i];
$value = $matches[2][$i];

if ( isset ( ${$value} ) $value = ${$value};
else $value = str_replace ( Array ( "[DOUBLE_QUOTE]", "[QUOTE]" ), Array ( "\\\'", "\'" ), $value );

$return_array[$key] = $value;

$input_clone = str_replace ( $full_match, '', $input_clone );
}

// process the rest of the string, if anything important is left inside of it
if ( preg_match_all ( '/\'?([^\':]+)\'?\s*\:\s*([^,]+)\s*,?\s*/', $input_clone, $matches ) ) {
foreach ( $matches[0] as $i => $full_match ) {

$key = $matches[1][$i];
$value = $matches[2][$i];

if ( isset ( ${$value} ) $value = ${$value};

$return_array[$key] = $value;
}
}
}


return $return_array;

}

Идея этой функции заключается в том, чтобы сначала заменить все возможные комбинации кавычек в нестандартной строке чем-то, что вы можете легко заменить, затем выполнить стандартное регулярное выражение для вашего ввода, а затем перестроить все, убедившись, что вы сбрасываете ранее замененные подстроки

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]