preg_replace_callback bricht ab

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • preg_replace_callback bricht ab

    Hallo,

    ich habe da mal ein Problem.
    Ich habe folgende Funktion für meine Syntax BBCodes

    Quellcode

    1. function bbcode_replace($string) {
    2. $old_string = array();
    3. while ($old_string != $string) {
    4. $old_string = $string;
    5. $string = preg_replace_callback('{\[(\w+)((=)(.*)|())\]((.|\n)*)\[/\1\]}U', 'bbcode_callback', $string);
    6. }
    7. return $string;
    8. }
    9. function bbcode_callback($matches) {
    10. $tag = trim($matches[1]);
    11. $inner_string = $matches[6];
    12. $argument = $matches[4];
    13. switch ($tag) {
    14. case 'php':
    15. $source = $inner_string;
    16. $language = 'php';
    17. $source = str_replace('"', '"', $source);
    18. $source = str_replace(">", ">", $source);
    19. $source = str_replace("<br />", "", $source);
    20. $source = str_replace("&lt;", "<", $source);
    21. $source = str_replace("&amp;", "&", $source);
    22. $geshi = new GeSHi($source, $language);
    23. $geshi->enable_keyword_links(true);
    24. $source = $geshi->parse_code();
    25. return '<div class="codebox"><div class="codebox_title">'.$language.'</div><div class="codebox_content">'.$source.'</div></div>';
    26. break;
    27. case 'css':
    28. $source = $inner_string;
    29. $language = 'css';
    30. $source = str_replace('"', '"', $source);
    31. $source = str_replace("&gt;", ">", $source);
    32. $source = str_replace("<br />", "", $source);
    33. $source = str_replace("&lt;", "<", $source);
    34. $source = str_replace("&amp;", "&", $source);
    35. $geshi = new GeSHi($source, $language);
    36. $geshi->enable_keyword_links(true);
    37. $source = $geshi->parse_code();
    38. return '<div class="codebox"><div class="codebox_title">'.$language.'</div><div class="codebox_content">'.$source.'</div></div>';
    39. break;
    40. // weitere für html4, html5, mysql etc.
    41. default: // unknown tag => reconstruct and return original expression
    42. $replacement = '[' . $tag . ']' . $inner_string . '[/' . $tag . ']';
    43. break;
    44. }
    45. return $replacement;
    46. }
    Alles anzeigen


    Das Problem ist nun, darauf konnte ich es eingrenzen, das Code der Länger als 12 Zeilen ist nicht verarbietet wird, der Apache stürzt ab.
    Ist der Code kürzer als 12 Zeilen klappt dies. Ist kein Code vorhanden sondern nur reiner Text so klappt dies ebenfalls.

    Was könnte an diesem Code Falsch sein?
  • Das ist wirklich merkwürdig. Wäre super, wenn du noch beschreibst wie Apache abstürzt. Fehlermeldung, CPU, ...
    Ansonsten würde ich spontan die bbcode_replace() anders aufbauen, da preg_replace_callback als Callback-Parameter eher keine Funktion, sondern ein Array erwartet. Sprich, ich würde ein Array aufbauen:

    Quellcode

    1. return $array = {
    2. [code=php] = {
    3. '&lt;' => '<';
    4. }
    5. [code=css] = {
    6. '&lt;' => '<';
    7. }
    8. }


    und dann rufst du als Callback das Array auf mit dem entsprechenden Wert, damit du die jeweilige Sprache hast. Denn momentan kommen sich deine Funktionen gegenseitig in die Quere, da beide ersetzen.