PHP: файл отступа с блоками, разделенными {и} - PullRequest
0 голосов
/ 02 апреля 2020

Как быстро сделать отступ для строки с блоками, обозначенными { и }?

Блоки могут быть глубоко вложенными.

Пример ввода:

a
b { c { d e 
} f }

должно привести к:

a 
b {
    c {
        d e
    }
    f
}

Я пытался использовать итеративный и рекурсивный подходы, но безуспешно. Regex тоже не работает.

Возможно, есть способ использовать PHP встроенные функции как print_r oder json_decode после умных замен { и {, но у меня тоже ничего не получилось.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Если в $content имеется только один блок верхнего уровня, а не несколько блоков верхнего уровня, здесь возможное решение:

function indentBlock($content,$depth=0)
{

    // function to build indent-spaces
    $indent = function($depth) {
        return str_pad("",$depth*self::INDENT," ");
    };

    // preg_match() splits $content in three parts:
    // <before> { <inbetween> } <after>
    if (preg_match('/^([^{]*){(.*)}([^}]*)$/',$content,$matches)) {

        // re-assemble $content with newlines
        $content = 
            $indent($depth).trim($matches[1])." {\n".

            // recurse for 
            $indent($depth+1).trim(self:: indentBlock($matches[2],$depth+1))."\n".
            $indent($depth)."}\n".
            $indent($depth).trim($matches[3]);
    }
    return $content;
}

Для нескольких блоков в $content мы должны обработать их с отдельным l oop впоследствии.

Пример ввода

a
b { c { d e 
} f }

обрабатывается в:

a
b {
  c {
    d e
  }
  f
}
0 голосов
/ 02 апреля 2020

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

http://sandbox.onlinephpfunctions.com/code/b2ff919c0b334f470c860d4632cad7e32693ae21

Единственное отличие состоит в том, что "de" находятся на разных строках, что соответствует к общему правилу.

...