Регулярки. Парсер таблиц.

Тема в разделе "Как сделать...", создана пользователем antiadmin, 3 ноя 2009.

Статус темы:
Закрыта.
  1. antiadmin

    antiadmin

    Регистр.:
    24 май 2008
    Сообщения:
    395
    Симпатии:
    23
    Помогите сделать парсер таблиц, точно такой же как в dokuwiki.
    Поясняю. Юзер вводит..
    Код:
    [table]
    ^ Zagolovok   ^ zagolovok2         ^ zgolovokN    ^
    | bla bla bla | full bla bla       | asdfas dfa   |
    | ewe bla bla | tyt polniy bla bla | asdfasdfadsf |
    [/table]
    на выходе должна получиться таблица типа
    Код:
    <table>
    <tbody><tr align="center">
    <th>Zagolovok</th>
    <th>zagolovok2</th>
    <th>zagolovokN</th>
    </tr>
    <tr align="center">
    <td>bla bla bla</td>
    <td>full bla bla</td>
    <td>asdfas dfa</td>
    </tr>
    <tr align="center">
    <td>ewe bla bla</td>
    <td>tyt polniy bla bla</td>
    <td>asdfasdfadsf</td>
    </tr></tbody></table>
    Пока понятно только:

    Код:
    $text=preg_replace('#\[table\](.*?)\[/table\]#si', '<table><tbody>\1</tbody></table>', $text);
    Полностью можно не писать, хотяб основу / идею, и желательно Pcre.
    Заранее благодарю.
    P.S. Понять как "это" происходит в dokuwiki не удалось :D
     
  2. капрал

    капрал

    Регистр.:
    2 окт 2008
    Сообщения:
    336
    Симпатии:
    45
    построчно читать ввод и разбивать строку по \s\|\s или заменять га </td><td> (получается триколонки)
    добавляешь в начале стрроки <tr><td> и в конце нее </td></tr>

    заголовки точно так же, только вместо \s\|\s заменяй \^
     
  3. antiadmin

    antiadmin

    Регистр.:
    24 май 2008
    Сообщения:
    395
    Симпатии:
    23
    а можно чуть подробнее и пояснее?
     
  4. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    1) $table - то что находится между и
    - проще регулркой, но можно и строковыми функциями
    2) $arr=explode("\r\n",$table) - массив строк
    3) заголовки = explode('^',$arr[0]) - можешь протримить (trim()) каждый элемент
    4) в цикле проходишь по остальным элементам массива $arr и разбиваешь его explode() по '|'
    ну и формуируешь массив

    вообще я не рекомендую решать такую задачу написание одного-двух СЛОЖНЫХ регулрных выражений
    1) сложность написания и отладки
    2) время работы и нагрузка увеличится

    алгоритм выше - строк 10-15 максимум
     
    antiadmin нравится это.
  5. antiadmin

    antiadmin

    Регистр.:
    24 май 2008
    Сообщения:
    395
    Симпатии:
    23
    Так.. ну
    PHP:
    $table str_replace('[table]'''$text);
    $table str_replace('[/table]'''$table);
    $arr=explode("\r\n",$table);
    $result=Array();

    while(
    in_array(''$arr))
    {
        
    $i array_search(''$arr);
        unset(
    $arr[$i]);

    }

    foreach(
    $arr AS $val)
    {
        
    $result[]=$val;
    }
    Получаем
    Код:
    Array
    (
        [0] => ^ Zagolovok   ^ zagolovok2         ^ zgolovokN    ^
        [1] => | bla bla bla | full bla bla       | asdfas dfa   |
        [2] => | ewe bla bla | tyt polniy bla bla | asdfasdfadsf |
    )
    
    Ну сделаю я $headers=explode('^', $result[0]);, а дальше что?
     
  6. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    PHP:
    <?php
    $table
    ='.....';
    $table str_replace('[table]'''$text);
    $table str_replace('[/table]'''$table);
    $arr=explode("\r\n",$table);

    $_arr=explode('^',$arr[0]);

    $table='';
    $table='<TABLE><TBODY>';
    $table.='<TR>';
    foreach(
    $_arr as $val$table.="<TD>$val</TD>";
    $table.='</TR>';
    for($=
    1;$i<count($arr);$i++)
    {
        
    $table.='<TR>';
        
    $_arr=explode('|',$arr[$i]);
        foreach(
    $_arr as $val$table.="<TD>$val</TD>";
        
    $table.='</TR>';
    }
    $table.='</TBODY></TABLE>';
    echo 
    $table;
    ?>
    как то так
    добавить в нужно месте -1 для того что бы убрать влияние закрывающего строку разделителя

    PS запускать и проверять было лень, надеюсь мысль ясна
     
    antiadmin нравится это.
Статус темы:
Закрыта.