Ankündigung

Einklappen
Keine Ankündigung bisher.

DIV erst nach bestimmter Zeilenhöhe einen Scrollbalken verpassen.

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • DIV erst nach bestimmter Zeilenhöhe einen Scrollbalken verpassen.

    Hallo Leute und schönes WE,

    ich habe eine Frage. Und zwar geht es darum einen DIV der PHP Code wieder geben soll so wie hier im Forum erst nach einer bestimmten Zeilenhöhe einen Scrollbalken zu verpassen.

    Momentan habe ich dafür zwei Funktionen geschrieben.

    Hier die für das Syntax Highlighting
    PHP-Code:
    if(!function_exists('php_string'))
    {
     function php_string($text)
     { 
         $text = stripslashes($text); 
         ob_start(); 
      $text = str_replace("\n", "", $text);
      $text = str_replace("<br />", "\n", $text);
         highlight_string("<?php".$text."?>");  
         $text = ob_get_contents(); 
         ob_end_clean(); 
         return "<div class=\"phpparser\">".$text."</div>"; 
     }
    }
    Und hier die eigentliche Text btw. BB-Code Parserfunktion
    [PHP]
    if(!function_exists('CodeParser'))
    {
    function CodeParser($text)
    {
    $text = preg_replace("/\
    PHP-Code:
    (.*)\[\/PHP\]/esiU", "php_string('$1')",    $text); 
      return 
    $text;
     }

    Bei der Funktion beschränke ich mich nur auf die PHP Code Tags.

    So rufe ich die Funktion dann auf wenn Text angezeigt werden soll.
    PHP-Code:
    $text nl2br($page['page_text']);
       echo 
    CodeParser($text); 
    So nun meine Frage wie kann ich es am besten anstellen das ich die Zeilen ermittel die den Code umfassen der in dem Div steht.

    Ich habe mir das so gedacht,das ich den String der in den [ PHP ][ /PHP ] BB-Codes steht nach allen \n durchsuche und diese Zähle und wenn eine vorgegebene Zahl erreicht wird das dann erst eine Scrollleiste im DIV erscheint.

    Wäre das dazu der richtige Ansatz? Wenn welche Funktionen wären da wichtig und die besten und wo müsste ich das dann ausführen in der Funktion für das Systayhightlighting oder im Code Praser oder erst dort wo ich die Funktion einsetze und ausführe?

    Ich denke dort wo ich das ausführe oder? Ich habe mir diese Funktionen selber geschrieben,aber bei dem Problem bin ich grad ein wenig blass.

    Danke für eure Hilfe mfg der litter

  • #2
    Das ist kein schlechter Ansatz. Könnte dann zB so aussehen:

    PHP-Code:
    $zeilen explode ("\n",$phpcode);
    $anz_zeilen count ($zeilen);

    // ...

    // Ausgabe:
    echo '<div style="width:90%;"';

    if (
    $anz_zeilen 25) {
       echo 
    'overflow:auto';
    }

    echo 
    '>';

    // Weitere Ausgaben ... 
    Erklärung: erst erzeugst du ein Array, welches alle Zeilen des Codes enthält (explode () mit \n), danach zählst du mit count (), wie viele Elemente im Array sind (entspricht der Anzahl der Zeilen). Danach prüfst du, ob diese Anzahl größer ist als zB. 25. Ist dies der Fall, muss die Ausgabe mit der CSS-Eigenschaft overflow:auto (ist der Inhalt größer als das Elternelement, werden Scrollbalken angezeigt) ausgestattet werden.

    GreeetZ

    Kommentar


    • #3
      Habe das jetzt mal in diese Funktion eingebaut aber es funktioniert leider nicht.

      PHP-Code:
      if(!function_exists('php_string'))
      {
       function php_string($text)
       { 
           $text = stripslashes($text); 
           ob_start(); 
        $text = str_replace("\n", "", $text);
        $text = str_replace("<br />", "\n", $text);
           highlight_string("<?php".$text."?>");  
           $text = ob_get_contents(); 
           ob_end_clean(); 
        
        //zeilenmenge ermitteln
        $zeilen = explode("\n",$text);
        $anz_zeilen = count($zeilen);
        
        $div = '<div class="phpparser"';
         if($anz_zeilen > 25)
         {
          echo 'style="overflow: auto;"';
         }
        $div.='>';
        $div.=$text;
        $div.='</div>';
        
           return $div; 
       }
      }

      Kommentar


      • #4
        Wenn du explode ("\n",$text); anwendest, kann du natürlich nicht vorher alle \n durch nichts ersetzen

        Und wenn du die Ausgabe zurückgibst (return), darfst du kein echo einsetzen Also dürfen schon, aber in dem Fall führt es zu einem Fehler

        Etwa so sollte es aussehen: (habs jetzt nicht getestet, aber sollte klappen!)

        PHP-Code:
        if(!function_exists('php_string'))
        {
         function php_string($text)
         { 
             
             $text = stripslashes($text); 
             ob_start(); 
             
             //zeilenmenge ermitteln
             $zeilen = explode("\n",$text);
             $anz_zeilen = count($zeilen);
             
             highlight_string("<?php".$text."?>");  
             $text = ob_get_contents(); 
             ob_end_clean(); 
          
          
          
             $div = '<div class="phpparser"';
             if($anz_zeilen > 25)
             {
               $div .= ' style="overflow: auto;"';
             }
             $div.= '>';
             $div.= $text;
             $div.= '</div>';
          
             return $div; 
         }
        }

        Kommentar


        • #5
          Ich habe das jetzt ma so versucht.

          PHP-Code:
          if(!function_exists('php_string'))
          {
          function php_string($text)

          if(preg_match("#^([ php ]+)(.*?)([\ /PHP ]+)$#si",$text,$treffer))
            {
              $text = stripslashes($text); 
             ob_start(); 
             //$text = str_replace("\n", "", $text);
             $text = str_replace("<br />", "\n", $text);
             highlight_string("<?php".$text."?>");  
             $text = ob_get_contents(); 
             ob_end_clean(); 
             //zeilenmenge ermitteln
             $phpcode = $treffer[1];
             $zeilen = explode("\n",$phpcode);
             $anz_zeilen = count($zeilen);
           
             $div = '<div class="phpparser"';
              if($anz_zeilen > 25)
              {
               echo 'style="overflow: auto;"';
              }
             $div.='>';
             $div.=$text;
             $div.='</div>';
            }
               return $div; 
           }
          }
          Nun wird mir der Div mit dem Code gar nicht mehr angezeigt.

          Mit dem preg_match will ich Filtern wenn PHP BB-Code vorkommt das dann darin die Zeilen ermitelt werden und dann der DIV wenn größer 25 Zeilen ist einen Scrollbalken bekommt.

          Aber wie gesagt es wird nun gar nichts mehr angezeigt. Fehlermeldungen kommen keine.

          Ps: Die Leerzeichen hier im preg_match für den BB-Code sind nur wegen dem Board hir drin,in meinem Original Code gibts die nicht.

          Kommentar


          • #6
            Der Fehler liegt bei
            PHP-Code:
            preg_match("#^([ php ]+)(.*?)([\ /PHP ]+)$#si",$text,$treffer
            . Mit Debuggen hättest du das sicherlich auch selber rausfinden können

            PHP-Code:
            if (preg_match("#^([ php ]+)(.*?)([\ /PHP ]+)$#si",$text,$treffer)) {
               
            //Anweisungen...
            } else {
               echo 
            "Ein Fehler bei preg_match ()";

            Kommentar


            • #7
              Ja stimmt der Fehler liegt wirklich im preg_match,sorry das ich ans debuggen net gedacht habe. Nur wo soll da der Fehler liegen?

              Kommentar


              • #8
                Gute Frage^^ Ich benutze lieber POSIX statt PCRE. Was heißt lieber ... ich hab mich halt bisher erst mit dem einen beschäftigt

                Kommentar


                • #9
                  Jetzt zeigt er mir den DIV an aber eben nicht so wie ich will,also der Scrollbalken erscheint nicht erst nach erreichter Zeilenanzahl sondern immer.

                  [PHP]
                  if(!function_exists('php_string'))
                  {
                  function php_string($text)
                  {
                  if(preg_match("#(
                  PHP-Code:
                  +)(.*?)([\/PHP]+)#si",$text,$treffer))
                    {
                      $text = stripslashes($text); 
                     ob_start(); 
                     $text = str_replace("\n", "", $text);
                     $text = str_replace("<br />", "\n", $text);
                     highlight_string("<?php".$text."?>");  
                     $text = ob_get_contents(); 
                     ob_end_clean(); 
                     //zeilenmenge ermitteln
                     $phpcode = $treffer[1];
                     $zeilen = explode("\n",$phpcode);
                     $anz_zeilen = count($zeilen);
                     
                     $div = '<div class="phpparser"';
                      if($anz_zeilen > 25)
                      {
                       echo 'style="overflow: auto;"';
                      }
                     $div.='>';
                     $div.= stripslashes($text);
                     $div.='</div>';
                    }
                    else
                    {
                     echo 'preg_match fehler';
                    }
                       return $div; 
                   }
                  }

                  Kommentar


                  • #10
                    Ein print_r ($treffer) hat mir ein etwas komisches Resultat geliefert Es ist sicher nicht das, was du brauchst (wegen $treffer[1] )

                    Kommentar


                    • #11
                      Danke für den Tipp mit dem print_r,da hätte ich selber drauf kommen können und habe es nun geschafft.

                      Hier der Code
                      PHP-Code:
                      <?php
                      if(!function_exists('php_string'))
                      {
                      function 
                      php_string($text)

                      if(
                      preg_match("#([ php ]+)(.*?)([\/ PHP ]+)#esiU",$text,$treffer))
                        {
                         
                      //print_r($treffer[0]);
                         
                      $text stripslashes($text); 
                         
                      ob_start(); 
                         
                      $text str_replace("\n"""$text);
                         
                      $text str_replace("\t"" "$text);
                         
                      $text str_replace("<br />""\n"$text);
                         
                      highlight_string("<?php".$text."?>");  
                         
                      $text ob_get_contents(); 
                         
                      ob_end_clean();
                       
                         
                      $phpcode explode("\n",$treffer[0]);
                         
                      $anz_zeilen count($phpcode);
                       
                         echo 
                      $anz_zeilen;
                       
                         
                      $div='PHP - Code';
                         if(
                      $anz_zeilen 25)
                         {
                          
                      $div.='<div class="phpparser"';
                          
                      $div.='style="height: 400px; overflow: auto;"';
                          
                      $div.='>';
                          
                      $div.= stripslashes($text);
                          
                      $div.='</div>';
                         }
                         else
                         {
                          
                      $div.='<div class="phpparser">';
                          
                      $div.= stripslashes($text);
                          
                      $div.='</div>';
                         }
                        }
                        else
                        {
                         echo 
                      'preg_match fehler';
                        }
                           return 
                      $div
                       }
                      }
                      ?>
                      Nun habe ich leider nur noch ein Problem und zwar,wenn jemand dann zwei Codes mit postet,wird nur ein DIV angezeigt,der 2 nicht mehr.

                      Nun habe ich nach preg_match_all geschaut,aber so richtig peilen tue ich das nicht. Kann mir da noch jemand ne Gedankenhilfe geben?

                      Vielen Dank mfg der litter

                      Kommentar


                      • #12
                        Hallo Leute,

                        ich mag nicht drängeln und hoffe das kommt nicht so rüber,aber hat jemand eine idee wie ich den code auf preg_match_all umbauen muss?

                        Vielen Dank,mfg der litter

                        Kommentar


                        • #13
                          vor allem nicht .*? und /U kombinieren. ? kehrt die greedyness um!

                          Kommentar


                          • #14
                            Wenn ich aber eines von beiden entferne,dann wird die Funktion nicht mehr richtig ausgeführt und das ganze wird zerschossen. Das heist der DIV wir in riesige Breite gezogen und mit scrollen ist dann auch nichts mehr.

                            Momentan bin ich überfragt und etwas Ratlos.

                            Kommentar


                            • #15
                              dann wird die Funktion nicht mehr richtig ausgeführt und das ganze wird zerschossen
                              Dann schau in das entstehende Resultat (unabhängig von der Formatierung) und analysiere das Problem.

                              Kommentar

                              Lädt...
                              X