Разбор строки

melnikovpa

Новичок
Разбор строки

Здравствуйте!

Возникла задача по курсовой универа. Прошу помощи.

сама задача:
{ name='abv' value='text.ru' {name='ttt' {name='blob' value='02b340rt4529v6'} value='ya.ru'} }{name='google' value='google.ru'}

В итоге на тестовом сайте нужно вывести вот такую структуру.

|abv
| |-ttt
| |-blob
|-google
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
И? Готовое решение надо? Сам как пробовал делать?
 

melnikovpa

Новичок
Я не прошу сделать за меня. Я прошу помочь мне понять теоретически как это сделать.

В основном меня интересует как сделать анализ фигурных скобок. Саму структуру составить не проблема.

Пробовал делать перебором строки. Но у меня из этого ничего не вышло. Видимо я не так делал. Перебор был банально прост ищем первую открывающую и последнюю закрывающуу, что прекрасно работало при строке вида {{{}}} однако на строке которую я привел выше это подход не работает.
 

AmdY

Пью пиво
Команда форума
во какие студенты пошли, летом, заранее, делают курсовые.

а ты можешь как-то формализовать правило, а то у меня не сходится, получается на основе строки должно быть
Код:
{name='abv' value='text.ru' 
      {name='ttt' value='ya.ru'
           {name='blob' value='02b340rt4529v6'} 
      } 
}
{name='google' value='google.ru'}
text.ru
----ya.ru
--------02b340rt4529v6
google.ru
у тебя вложеность непонятно как определяется и ты то берёшь value для названия ноды, то name
 

melnikovpa

Новичок
Да)) Да просто препод сказал 7 августа с первыми результатми прийти. И что ему в отпуске не седится...

Для названия node берется name, описался прошу извинить.

Да, на основе строки грубо говоря должен получиться TreeView. Строки ограничены символами {}, в каждую строку и подстроку может входить сколь угодно подстрок. Берется радительская строка это главный нод и все подстроки Это дочерние ноды.
 

Вурдалак

Продвинутый новичок
Может всё же
Код:
|abv
| |-ttt
| | |-blob
|-google
?

Надо релизовать токенизацию (получение лексем типа «открывающая скобка "{"», «значение в кавычках», «пробелы» и т.д.). Оно, в принципе, может быть ещё на более низком уровне («кавычка», «апостроф», ...). Далее строится матрица переходов конечного автомата и парсится строка. Например, можешь посмотреть xBB. Как один из способов, хоть и, быть может, не самый рациональный для данной задачи.
 

melnikovpa

Новичок
Да, именно так. так изначально и было написано
|abv
| |-ttt
| | |-blob
|-google

парсер robots.txt предназначен для анализа ссылок и к текущей задаче он не подходит, но все равно спасибо.
 

Вурдалак

Продвинутый новичок

phprus

Moderator
Команда форума
melnikovpa
В принципе можно облегчить себе задачу и не писать таблицы переходов автоматов вручную, а воспользоваться средствами, которые сгенерируют парсер по описанной грамматике. К примеру можно воспользоваться http://pear.php.net/package/PHP_LexerGenerator и http://pear.php.net/package/PHP_ParserGenerator

При парсинге генерируешь соответствующее дерево, а потом при его рекурсивном обходе выводишь то, что тебе надо.
 

melnikovpa

Новичок
Ну вот, решение в лоб:

PHP:
<?PHP   echo $str = "{ name='abv' value='text.ru' {name='ttt' {name='blob' value='02b340rt4529v6'} value='ya.ru'} }{name='google' value='google.ru'}";     $rez = array();  $g = $a = 0;  for ($i=0, $len=strlen($str); $i<$len; $i++) {          if ($str[ $i ] == "{") {                  $g++;                  if (isset($rez[$a])) $a = count($rez);                  //else $a++;                  $rez[ $a ] .= str_repeat("|",$g);                  continue;                  }          if ($str[ $i ] == "}") {                  $g--;                  $a--;                  if (!isset($rez[$a])) $rez[ $a ] = str_repeat("|",$g);                  continue;                  }          $rez[ $a ] .= $str[ $i ];          }     foreach ($rez as $t) echo $t,"<br>";  ?>

В данный момент пробую сделать эту функцию через strpos. Но только пока безуспешно.

Строка же у нас может быть огоромной. Перебор долго работать будет. Я так понял нужно искать вхождение первого открывающего первого закрывающего, но как дальше пока не сообразил.
 

Вурдалак

Продвинутый новичок
melnikovpa, как ты так копировал код, что он получился в одну строку? Мне всегда было это интересно.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
жмем ответить и цитировать, там на кнопку php код, и вот после вставки в это мини-окошко сжираются переводы строк...
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Да я сам пишу обычно через быстрый ответ и BB коды, а сначала пару раз обломался и забил писать через окошко)
 
Сверху