Mam nadzieję, że dobre forum wybrałem. Poniższy kod nie jest taki php początkujący, ani konkretnie pod PHP5, ani nie zaliczę go do php Pro
W wielu systemach jest problem ze stosowaniem tych samych znaczników w tych samych znacznikach znacznikach. Ku mojemu zaskoczeniu, nawet IPB nie radzi sobie z tym dobrze (w przeciwieństwie do phpBB):
Kod
<?php
echo "
"; // echo wyświetla [/ code]echo "
?>[/code]
albo
Kod
[code]
[/code][ code][ code][/ code][/ code]
Próbuję ostatnie 4 dni napisać jakiś porządny skrypt, który będzie sprawdzał, czy [/ code] oznacza koniec kodu, czy to tylko jego część.
Powstało kilka różnych schematów, większość działała na zasadzie liczenia, ile otwieranych znaczników znajduje się pomiędzy pierwszym otwartym znaczniku i pierwszym zamykanym znaczniku, potem pętlą się dodaje do wyrażenia warunkowego znalezione znaczniki otwierające, oznacza się zmienną liczbę otwartych znaczników, potem pętla chodzi w nieskończoność, aż znajduje kolejne znaczniki (liczone od ostatniego wyrażenia, do znalezienia kolejnego [/ code]. Na razie zakładam, że użytkownik nie zapomniał zamknąć żadnego znacznika, potem to się dorobi. Ostatnia wersja, osiąga takie same cele co poprzednia, tylko ma troszkę mniej linijek (specjalnie dla IPB zmieniłem znacznik z [ code] na [cod]):
<?php $a = '[cod][/cod] [cod][cod][/cod][/cod]'; $a = '[cod][cod][/cod][cod][/cod][/cod]'; $open_tags = 1; $regexp = '#[cod](.*?)[/cod]#si'; while ($open_tags != 0) { $buffer = ''; for ($i = 1; $i <= $count; $i++) { $buffer .= '.*?[cod]'; } $open_tags += $count; } else { $nextLoop = ''; $open_tags = $count; } if ($open_tags == 0) { break; } $open_tags--; $regexp = $i; } } } ?>
Jeżeli znaczniki są w stylu: "ciągle otwieramy a potem zamykamy" to skrypt radzi sobie z tym wspaniale, niestety, jeżeli namotamy mu, to gubi jakiś jeden zamykający.
Poniżej publikuje także tą metodę klasy bbCode, nie wiem jak działa, bo dawno nie sprawdzałem, a może komuś przyda się w udzieleniu odpowiedzi:
<?php private function superWhile($start,$end,$alternate_start = '') { if ($alternate_start) { $start = '('.$start.'|'.$alternate_start.')'; } else { $start = '('.$start.')'; } $buffer = ''; $open_tags = $count; for ($y = 1; $y <= $count; $y++) { $buffer .= '.*?'.$end; } $buffer = $start.$buffer; if ($open_tags != 0) { $open_tags = $open_tags + $count - 1; // - 1 $temp_buffer = ''; for ($y = 1; $y <= $open_tags; $y++) { $temp_buffer .= '.*?'.$end; } $buffer .= $temp_buffer.'.*?'.$end; if ($open_tags == 0) { break; } } // $buffer = preg_replace('#.*?[/]$#si','',$buffer); } // $buffer = preg_replace('#^[].*?#si','',$buffer); } } else { $buffer .= '.*?'.$end; } $this -> exploded[$uniqID] = $i[1]; } } ?>