Napisałem skrypt, który zamienia znaczniki bbcode na html:
  1. <?php
  2. function BBcodeOut($object)
  3. {
  4. $bbcode = array(
  5. '![url[=]?(.*?)?](.*?)[/url]!sie',
  6. '!(.*?)!sie',
  7. '!(.*?)!sie',
  8. '!(.*?)!sie',
  9. '![quote[=]?(.*?)?](.*?)[/quote]!sie',
  10. '!(.*?)!sie',
  11. '!(.*?)!sie',
  12. '!
      (.*?)
    !sie'
  13. );
  14.  
  15. $replace = array(
  16. '\"<a href=\"http://\". str_replace( \"http://\"\"\", ( \"$1\"==\"\"?\"$2\":\"$1\" ) ) .\"\" target=\"_blank\">\". ( strlen( \"$2\" )>25?substr( \"$2\", 0, 10 ).\"...\".substr( \"$2\", -10 ):\"$2\" ) .\"</a>\"',
  17. '\"<strong>$1</strong>\"',
  18. '\"<i>$1</i>\"',
  19. '\"<u>$1</u>\"',
  20. '( \"$1\"!==\"\"?showUsername( \"$1\" ).\" <strong>napisał(a):</strong><br />\":\"<strong>Cytat:</strong><br />\" ) .\"<div class=\"quote_box\">$2</div>\"',
  21. '\"<span style=\"color:$1;\">$2</span>\"',
  22. '\"<span style=\"font: 10px $1;\">$2</span>\"',
  23. '\"<ul>\". str_replace( \"[/*]\"\"</li>\", str_replace( \"[*]\"\"<li>:arrow: \"\"$1\" ) ) .\"</ul>\"'
  24. );
  25.  
  26. $object = preg_replace( $bbcode, $replace, $object );
  27.  
  28. return $object;
  29. }
  30. ?>


Problem polega na tym, że opisałem stronę XHTML'em, a wiadomo że jeśli znaczniki krzyżują się wyświetli się drzewko zamiast strony. Aby temu zapobiec postanowiłem napisać blokadę przed mieszaniem tagów. Oto co wymyśliłem:
  1. <?php
  2. function safeBBcode( $object )
  3. {
  4. $rozbity = preg_split( '!([/[*a-z]*])([^[^].]*?[[^/][*a-z]*=?.*?])!si', $object, -1, PREG_SPLIT_DELIM_CAPTURE );
  5.  
  6. for($x=0;$x<=count($rozbity);$x++)
  7. {
  8. if($x == 0 || $x == count( $rozbity ) )
  9. {
  10. $string = $rozbity[$x] . $rozbity[$x+1];
  11. }
  12. else
  13. {
  14. $string = $rozbity[$x] . $rozbity[$x+1]. $rozbity[$x+2];
  15. $x++;
  16. }
  17.  
  18. preg_match_all( '![([^/][*a-z]*)=?.*?]!si', $string, $matches_1 );
  19. preg_match_all( '![/([*a-z]*)]!si', $string, $matches_2 );
  20.  
  21. $y = count( $matches_1[1] );
  22.  
  23. for($v=0;$v<count( $matches_1[1] );$v++)
  24. {
  25. $y--;
  26.  
  27. if( $matches_1[1][$y] !== $matches_2[1][$v] )
  28. {
  29. return $string;
  30. }
  31. }
  32.  
  33. $string = '';
  34.  
  35. $x++;
  36. }
  37.  
  38. return 0;
  39. }
  40. ?>


Nadal jednak nie działa w 100%... ma problem ze sprawdzaniem, jeśli wewnątrze jednego tagu zawarte są 2 lub więcej innych np:
Cytat
[aa][bb][/bb][cc][/cc][/aa]


Nie mam pomysłów jak to poprawić, więc proszę o pomoc sad.gif