2010-04-16 2 views
0

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

file { 

nextopen { 
//content 
} 

} 

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

массив должен выглядеть следующим образом:

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

Нет, я не знаю, что вы имеете в виду. Можете ли вы привести пример того, как должен выглядеть результирующий массив? –

+0

добавил, какой массив должен выглядеть как – David

+1

Это, вероятно, не будет таким тривиальным, как можно было бы интуитивно подумать. Вам нужно будет токенизировать ввод. Для этого вам нужно дать больше информации о грамматике ввода. Например; каковы критерии для идентификаторов? (символы новой строки, пробелы, символы и т. д.). См. Статью в Википедии о Лексическом анализе относительно того, почему это не так тривиально: http://en.wikipedia.org/wiki/Lexical_analysis –

ответ

3

Основной алго для этого, как следующий

  1. для каждой последовательности { no-braces-here }, поместить его в буфер и заменить магическое число, идентифицирующее его положение в буфере
  2. repeat (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('[email protected](\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! } 
) 

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

Смежные вопросы