Разобрать строку в действительный объект php - PullRequest
2 голосов
/ 21 марта 2012

Я получаю строку, подобную этой:

{
    key1 = "some value";
    key2 = "some value";
    key3 = "some value";
    key4 = 1235678;
}

и мне нужно разобрать его, чтобы он стал действительным объектом или массивом php. Я полагаю, Regex - это то, что нужно, но я очень плох в этом.

Ответы [ 3 ]

1 голос
/ 21 марта 2012

Вы в основном должны разобрать это самостоятельно. К счастью, вы можете по крайней мере сначала разбить его на токены с помощью token_get_all :

$str = '{
    key1 = "some= value1";
}';
print_r(token_get_all('<?php ' . $str . ' ?>'));

/* output:

Array
(
    [0] => Array
        (
            [0] => 368
            [1] =>  1
        )

    [1] => {
    [2] => Array
        (
            [0] => 371
            [1] => 

            [2] => 1
        )

    [3] => Array
        (
            [0] => 307
            [1] => key1
            [2] => 2
        )

    [4] => Array
        (
            [0] => 371
            [1] =>  
            [2] => 2
        )

    [5] => =
    [6] => Array
        (
            [0] => 371
            [1] =>  
            [2] => 2
        )

    [7] => Array
        (
            [0] => 315
            [1] => "some= value1"
            [2] => 2
        )

    [8] => ;
    [9] => Array
        (
            [0] => 371
            [1] => 

            [2] => 2
        )

    [10] => }
    [11] => Array
        (
            [0] => 371
            [1] =>  
            [2] => 3
        )

    [12] => Array
        (
            [0] => 370
            [1] => ?>
            [2] => 3
        )

)

*/

Затем можно выполнить итерацию по возвращенному массиву в поисках = и ;, чтобы найти назначения и конец операторов. Имейте в виду, что он будет анализировать токены, которые должны быть интерполированы, например, key1 = "some $value" будет анализировать $value.

1 голос
/ 21 марта 2012

Попробуйте это .. Сумасшедший, но он работает (я бы все равно рекомендовал JSON)

    $string = '{
        key1 = "some value";
        key2 = "some value";
        key3 = "some value";
        key4 = 1235678;
    }' ;



    var_dump(parseString($string));

    function parseString($string)
    {
        $output = array();
        $string = str_replace(array("{","}"), "", $string);
        $string = explode(";",$string) ;

        foreach($string as $values)
        {
            $values = trim($values);

            if(strpos($values, "="))
            {
                list($key,$value) = explode("=",$values);
                $value = trim($value) ;
                $value = trim($value,"\"") ;
                $key = trim($key);
                $output[$key] = $value;
            }
        }

        return $output ;
    }

Результат

    array
    'key1 ' => string 'some value' (length=10)
    'key2 ' => string 'some value' (length=10)
    'key3 ' => string 'some value' (length=10)
    'key4 ' => string '1235678' (length=7)
0 голосов
/ 21 марта 2012
$strA = array_filter(explode(";",YourString));
foreach($strA as $combineValue){
   $cV = array_filter(explode("=",combineValue));
    echo $cv[0].'--'.$cv[1];
}

Сейчас нет ресурсов для тестирования фрагмента.Но я думаю, что это должно помочь.

Это проверенное преобразование JSON вашего ответа (может помочь вам), было бы хорошо, если бы вы могли получить json respose:

{
"key1": "some value",
"key2": "some value",
"key3": "some value",
"key4": 1235678
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...