递归标记化器

时间:2013-12-02 10:55:07

标签: php tokenize

我正在尝试创建一个递归标记生成器来处理这个字符串并将其转换为多维数组。

输入:

a,b,c(a,b,c),d(a,b(a,b)),e

输出

$r = [
    'a' => 'a',
    'b' => 'b',
    'c' => [
        'a' => 'a',
        'b' => 'b',
        'c' => 'c'
        ],
    'd' => [
        'a' => 'a',
        'b' => [
            'a',
            'b'
            ]
        ],
    'e' => 'e'
    ];

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我会首先对您的字符串进行标记,然后将其转换为JSON字符串并将其解码为关联数组。我建立了一个小功能:

$str = 'a,b,c(a,b,c),d(a,b(a,b)),e';

function parse($str) {
    preg_match_all('/[a-z\\(\\)]/', $str, $matches);

    $jsonStr = '{';
    $tokensCount = count($matches[0]);
    $tokens = $matches[0];

    for($i = 0; $i < $tokensCount; ++$i) {
        $nextToken = isset($tokens[$i+1])?trim($tokens[$i+1]):false;
        $currentToken = trim($tokens[$i]);

        if($currentToken == '(') {
            $jsonStr .= '{';
            continue;
        } elseif( $currentToken == ')') {
            $jsonStr = substr($jsonStr, 0, -2) . '}, ';
            continue;
        }

        if($nextToken == '(') {
            $jsonStr .= '"' . $currentToken . '": ';
        } else {
            $jsonStr .= '"' . $currentToken . '": "' . $currentToken . '", ';
        }
    }

    $jsonStr = substr($jsonStr, 0, -2) . '}';

    return json_decode($jsonStr, true);
}

var_dump(parse($str));