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

Статус
В этой теме нельзя размещать новые ответы.

antiadmin

Местный житель
Регистрация
24 Май 2008
Сообщения
395
Реакции
24
Помогите сделать парсер таблиц, точно такой же как в 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
 
построчно читать ввод и разбивать строку по \s\|\s или заменять га </td><td> (получается триколонки)
добавляешь в начале стрроки <tr><td> и в конце нее </td></tr>

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

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

алгоритм выше - строк 10-15 максимум
 
Так.. ну
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]);, а дальше что?
 
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 запускать и проверять было лень, надеюсь мысль ясна
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху