Pozwoliłem sobie napisać funkcję, która znajduje elementy [ol], [li] rekursywnie.
Do testowania używam takiego zbioru danych:
$text = '
[ol]
[li]el. 1
[ol]
[li]el1.1[/li]
[li]el1.2
[ol]
[li]efssdf[/li]
[/ol]
[/li]
[/ol]
[/li]
[li]el2[/li]
[/ol]
[ol]
[li]DEDFDFFD
[ol]
[li]AAA[/li]
[/ol]
[/li]
[li]fdsfs[/li]
[/ol]
[ol]
[li]11113442ADEDFDFFD
[ol]
[li]fdfsd
[ol]
[li]ela1[/li]
[li]ela
[ol]
[li]ola
[ol]
[li]fsdfsdfsd[/li]
[/ol]
[/li]
[/ol]
[/li]
[/li]
[/ol]
[/li]
[/ol]
[ol]
[li]fddf
EEfds
[/li]
[/ol]
[ol]
[li]fddf EEfds45453545435[/li]
[li]fddf EEfds45453545435[/li]
[li]fddf EEfds45453545435[/li]
[li]fddf EEfds45453545435[/li]
[/ol]
';
A funkcja to:
function recursiveRegexp($text, $level, $tag = 'ol')
{
$pattern = "#\[$tag\](((?:[^[]|\[(?!/?$tag\])|(?R)))*)\[/$tag\]#";
$count = count($matches); if (null === $max0Levels)
{
$count = @count($matches[1
]) ?
: 0; $max0Levels = $count;
}
if (1 < $count)
{
for ($i = 0 ; $i < $count ; $i++)
{
{
echo "Level $level: {$matches[1][$i]} <br/>"; recursiveRegexp($matches[1][$i], $level+1, $tag);
}
}
}
}
No i wywołanie to
recursiveRegexp($text, 0);, a na wyjściu pojawia się:
Kod
Level 0: [li]el. 1 [ol] [li]el1.1[/li] [li]el1.2 [ol] [li]efssdf[/li] [/ol] [/li] [/ol] [/li] [li]el2[/li]
Level 1: [li]el1.1[/li] [li]el1.2 [ol] [li]efssdf[/li] [/ol] [/li]
Level 2: [li]efssdf[/li]
Level 0: [li]DEDFDFFD [ol] [li]AAA[/li] [/ol] [/li] [li]fdsfs[/li]
Level 1: [li]AAA[/li]
Level 0: [li]fdfsd [ol] [li]ela1[/li] [li]ela [ol] [li]ola [ol] [li]fsdfsdfsd[/li] [/ol] [/li] [/ol] [/li] [/li] [/ol] [/li]
Level 1: [li]ela1[/li] [li]ela [ol] [li]ola [ol] [li]fsdfsdfsd[/li] [/ol] [/li] [/ol] [/li] [/li]
Level 2: [li]ola [ol] [li]fsdfsdfsd[/li] [/ol] [/li]
Level 3: [li]fsdfsdfsd[/li]
Level 0: [li]fddf EEfds [/li]
Level 0: [li]fddf EEfds45453545435[/li] [li]fddf EEfds45453545435[/li] [li]fddf EEfds45453545435[/li] [li]fddf EEfds45453545435[/li]
Jest tylko jedno małe ale...po co to wszystko, skoro możnaby było po prostu zastosować coś na wzór:
$new = str_replace(array('[li]', '[ol]', '[/li]', '[/ol]'), array('<li>', '<ol>', '</li>', '</ol>'), $text);
Tak czy inaczej, może to rekurencyjne monstrum, które skleciłem, komuś się przyda