PHP фигурные скобки в массив - PullRequest
0 голосов
/ 16 апреля 2010

Я хотел бы проверить открытый файл .txt на наличие фигурных скобок, которые открываются и закрываются, как показано ниже:

file {

nextopen {
//content
}

}

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

массив должен выглядеть так:

array(
[file] => '{ nextopen { //content } }',
[nextopen] => '{ //content }'
);

1 Ответ

3 голосов
/ 16 апреля 2010

Основной алгоритм для этого подобен следующему

  1. для каждой последовательности { no-braces-here }, поместите ее в буфер и замените магическим числом, определяющим его положение в буфере
  2. повторять (1) до тех пор, пока не будет найдено больше последовательностей
  3. для каждой записи в буфере - если она содержит магические числа, замените каждое число соответствующей строкой из буфера.
  4. буфер - это то, что мы ищем

в php

class Parser
{
    var $buf = array();

    function put_to_buf($x) {
        $this->buf[] = $x[0];
        return '@' . (count($this->buf) - 1) . '@';
    }

    function get_from_buf($x) {
        return $this->buf[intval($x[1])];
    }

    function replace_all($re, $str, $callback) {
        while(preg_match($re, $str))
            $str = preg_replace_callback($re, array($this, $callback), $str);
        return $str;
    }

    function run($text) {
        $this->replace_all('~{[^{}]*}~', $text, 'put_to_buf');
        foreach($this->buf as &$s)
            $s = $this->replace_all('~@(\d+)@~', $s, 'get_from_buf');
        return $this->buf;
    }



}

тест

$p = new Parser;
$a = $p->run("just text { foo and { bar and { baz } and { quux } } hello! } ??");
print_r($a);

результат

Array
(
    [0] => { baz }
    [1] => { quux }
    [2] => { bar and { baz } and { quux } }
    [3] => { foo and { bar and { baz } and { quux } } hello! }
)

дайте мне знать, если у вас есть какие-либо вопросы.

...