Ergebnis 1 bis 7 von 7

Thema: [PHP/MySQL/HTML]PHP Funktion: nl2br() - aber nicht überall?

  1. #1

    [PHP/MySQL/HTML]PHP Funktion: nl2br() - aber nicht überall?

    Hi Leute,
    hab wieder ein kleines Problemchen bezüglich der Ausgabe einer Datenbank.

    Ich habe eine MySQL Tabelle mit den namen "sites"

    Aufbau Tabelle "sites"
    • site_id INT, auto-incr.
    • site_name VARCHAR
    • site_title VARCHAR
    • site_text TEXT
    • site_lastsave INT


    In dieser Tabelle wird anhand des Seitennamens via $_GET[] aus der Adresszeile gelesen und in einer Funktion übergeben, welche Entsprechend die angeforderte Seite inkl Sprachauswahl lädt. Das funktioniert Super und ohne Probleme. Allgemein nutze ich gern die Funktion nl2br() um die Zeilenbrüche aus der DB in br/ umzuwandeln. nun gibts ein kleines Problem, da ich via Pseudo-BBCode eine Tabelle Erzeuge welche sich in der D-Zelle "site_text" befindet.

    das sieht als beispiel wie folgt aus

    Inhalt DB sites -> site_text
    Code (Text):
    1.  
    2. [TABELLE]
    3. [ZEILE]
    4. [SPALTE-F="250"]Firma:[/SPALTE-F]
    5. [SPALTE="500"]Die Firma GmbH[/SPALTE]
    6. [/ZEILE]
    7. [ZEILE]
    8. [SPALTE-F="250"]Sitz der Firma:[/SPALTE-F]
    9. [SPALTE="500"]Musterstraße 2
    10. 12345 Musterstadt[/SPALTE]
    11. [/ZEILE]
    12. [ZEILE]
    13. [SPALTE-F="250"]Kontakt:[/SPALTE-F]
    14. [SPALTE="500"]Tel: (+49) 12 34 - 5 67 89
    15. Fax: (+49) 12 34 - 5 67 80[/SPALTE]
    16. [/ZEILE]
    17. [/TABELLE]
    18.  
    dieser Pseudo BBCode wird durch eine Funktion in html umgestaltet

    Auszug BBCode Funktion in functions.php
    Code (PHP):
    1.  
    2. function bbcode($textblock) {
    3.  
    4. #global $textblock;
    5.  
    6. $text_old = array("[F]", "[/F]", "[HR]", "[OK]", "[H6]", "[/H6]", "[H5]", "[/H5]", "[H4]", "[/H4]",
    7.                   "[TABELLE]", "[/TABELLE]", "[ZEILE]", "[/ZEILE]", "[SPALTE-F=\"", "[/SPALTE-F]", "[SPALTE=\"", "\"]", "[/SPALTE]");
    8. $text_replace = array("<b>", "</b>", "<hr style=\"width: 300px; border-top: 3px solid #006600; \">",
    9.                       "<img src=\"img/ico/ok.gif\" alt=\"OK!\" style=\"position:relative; top:2px;\">",
    10.                       "<div class=\"h6_bbcode\">", "</div>", "<div class=\"h5_bbcode\">", "</div>",
    11.                       "<span class=\"h4_bbcode\">", "</span>", "<table style=\"margin: 0 0 0 0;\" border=\"0\" cellpadding=\"0\" cellspacing=\"10\" width=\"100%\">",
    12.                       "</table>", "<tr>", "</tr>", "<th style=\"text-align: left;\" width=\"", "</th>", "<td width=\"", "\">", "</td>");
    13. $text_neu = str_replace($text_old, $text_replace, $textblock);
    14.  
    15. return $text_neu;
    16. }
    17.  

    nun macht halt die PHP Funktion nl2br() alles richtig jeder Zeilenumbruch wird mit einem <br /> ersetzt. dadurch befinden sich am umgewandelten HTML Source am ende jeder Zeile ebenfalls ein brake... dieser verursacht der Anzahl der Zeilen entsprechend eine Abstand von Oberkante der Inhaltsseite dementsprechend unnötige Zeilenumbrüche

    dadurch wird die Tabelle wie folgt ausgegeben

    SEITENTITEL
    br
    br
    br
    br
    br
    br
    br
    TABELLENBEGINN

    lässt sich da was machen ? das Zeilenümbrüche innerhalb einer Zelle möglich sind aber nicht überall um die Tabellendarstellung drumherum?

    schon mal danke im Vorraus
    Geändert von venom2k6 (25.04.18 um 14:06 Uhr)

  2. #2

    Re: [PHP/MySQL/HTML]PHP Funktion: nl2br() - aber nicht überall?

    Anfang und ende kann mit trim() gelöst werden. Alles was sich in einer z.B. Tabelle befindet würde ich vorher rausfiltern, die \n komplett entfernen, danach kannst du mit nl2br() die <br> ersetzen.

    Ich Persönlich nutze lieber markdown als die BB-Code syntax, vielleicht wäre das eine option.

  3. #3
    Mitglied Avatar von darksider3
    Registriert seit
    Sep 2013
    Ort
    /dev/sda
    Beiträge
    202

    Re: [PHP/MySQL/HTML]PHP Funktion: nl2br() - aber nicht überall?

    @venom2k6:
    die Tabellendarstellung drumherum?
    Du meinst, aus deinem (Pseudo-Code)-Beispiel oben die Zeilen 1 und 18?
    Dann würde ich per Regex/PCRE nach (deskriptives Beispiel) "any amount of newlines followed by '[TABELLE]' results into [TABELLE]" suchen, selbiges für den closing-tag. Ich hab gerade sowas im Kopf wie
    Code (PCRE):
    1. /(*ANY)\n*(\[TABELLE\])/ug
    und als Substitute einfach
    Code (PCRE):
    1. \n$1
    nehmen, ist aber wrsl falsch.
    Passende closing wäre dann:
    Code (PCRE):
    1. /(*ANY)(\[\/TABELLE\])\n*/ug
    und dazu als sub die
    Code (PCRE):
    1. $1\n
    EDIT:// (*ANY) und der u-Modifikator dürfen nie fehlen!
    Geändert von darksider3 (25.04.18 um 17:24 Uhr)
    Effiziens ist, wenn ich ein Loch bohre und mein Nachbar auch ein Bild aufhängen kann. ;)
    Redundanz macht wiederholen unnötig. | quod erat expectandum - Unbekannt|Veni, vidi,vici - Iulius Caesar

  4. #4
    Mitglied

    (Threadstarter)

    Avatar von venom2k6
    Registriert seit
    Jul 2013
    Beiträge
    69

    Re: [PHP/MySQL/HTML]PHP Funktion: nl2br() - aber nicht überall?

    also meine Ausgabe erfolgt in meiner imprint.php
    Code (PHP):
    1.  
    2. <main>
    3.                 <article>
    4.                     <header><?php echo utf8_encode(site_out('site_title')); ?></header>
    5.                     <main>
    6.                         <?php
    7.                        
    8.                         $site_text = site_out('site_text');
    9.                        
    10.                         echo nl2br(bbcode(utf8_encode($site_text)));
    11.                         ?>
    12.                        
    13.                        
    14.                     </main>
    15.                 </article>
    16.             </main>
    17.  
    Das erzeugt laut GChrome Quelltextanzeige folgenden Code Schnipsel
    Code (HTML5):
    1.  
    2.                     <header>Impressum</header>
    3.                     <main>
    4.                         <table style="margin: 0 0 0 0;" border="0" cellpadding="0" cellspacing="10" width="100%"><br />
    5. <tr><br />
    6. <th style="text-align: left;" width="250">Firma:</th><br />
    7. <td width="500">Die Firma GmbH</td><br />
    8. </tr><br />
    9. <tr><br />
    10. <th style="text-align: left;" width="250">Sitz der Firma:</th><br />
    11. <td width="500">Musterstraße 2<br />
    12. 12345 Musterstadt</td><br />
    13. </tr><br />
    14. <tr><br />
    15. <th style="text-align: left;" width="250">Kontakt:</th><br />
    16. <td width="500">Tel: (+49) 12 34 - 5 67 89
    17. Fax: (+49) 12 34 - 5 67 80</td><br />
    18. </tr><br />
    19. </table>                        
    20.                        
    21.                     </main>
    22.                 </article>
    23.             </main>
    24.  
    die Funktion nl2br() setzt an ende jeder Zeile (weil es ja aus der DB so ausgelesen wird) den Brake jedoch werden Brakes nicht an der Stelle dargestellt sondern über der Tabelle, sodass eine dementsprechende Lücke zwischen Seitentitel und Tabelle entsteht.

    trim brachte hier leider keinen Erfolg

    @darjsider3

    kannst du mir das etwas genauer erläutern?? wäre net

  5. #5
    Mitglied Avatar von darksider3
    Registriert seit
    Sep 2013
    Ort
    /dev/sda
    Beiträge
    202

    Re: [PHP/MySQL/HTML]PHP Funktion: nl2br() - aber nicht überall?

    @venom2k6: Das Problem ist, das die "<br/>" nicht innerhalb der Zellen(<td></td>) sind, sondern außerhalb, falls Du das meinst.

    Ich dachte, bei meiner Antwort zuvor, an Newlines die unnötigerweise vor dem Anfang der Tabelle sind(any amount whitespace followed by a [table]), aber Du hast dass Problem, das die newlines(Kontextangaben) ignoriert werden(weil sie in keinem Kontext stehen, abgesehen von der Tabelle), weshalb jede "Normale" HTML-Parsing-Engine die Newlines so interpretieren wird, als ob sie zur Tabelle selbst gehören, und nicht zu den korrespondierenden Zellen.

    D.h.: Wenn die Newlines innerhalb deiner Tags sind(<td>hier</td>) wird das funktionieren, alle anderen werden der Tabelle selbst zugerechnet, was deinen Abstand von Oben erzeugt, wenn ich richtig liege.^^
    Effiziens ist, wenn ich ein Loch bohre und mein Nachbar auch ein Bild aufhängen kann. ;)
    Redundanz macht wiederholen unnötig. | quod erat expectandum - Unbekannt|Veni, vidi,vici - Iulius Caesar

  6. #6
    Mitglied

    (Threadstarter)

    Avatar von venom2k6
    Registriert seit
    Jul 2013
    Beiträge
    69

    Re: [PHP/MySQL/HTML]PHP Funktion: nl2br() - aber nicht überall?

    Zitat Zitat von darksider3 Beitrag anzeigen
    @venom2k6: Das Problem ist, das die "<br/>" nicht innerhalb der Zellen(<td></td>) sind, sondern außerhalb, falls Du das meinst.

    D.h.: Wenn die Newlines innerhalb deiner Tags sind(<td>hier</td>) wird das funktionieren, alle anderen werden der Tabelle selbst zugerechnet, was deinen Abstand von Oben erzeugt, wenn ich richtig liege.^^
    Exakt genau das ist das Problem! und dafür suche ich eine Lösung die Zeilenumbrüche innerhalb der erzeugten Tabelle funktionieren, die Außerhalb (außerhalb der Tags am ende) werden über der Tabelle gepackt und das möchte ich nicht die sollen weg ^^

  7. #7

    Re: [PHP/MySQL/HTML]PHP Funktion: nl2br() - aber nicht überall?

    prinzipiell ist das problem das du mit
    Code (PHP):
    1.  
    2. [TABELLE][COLOR="#FF0000"]\n[/COLOR]
    3. [ZEILE][COLOR="#FF0000"]\n[/COLOR]
    4. [SPALTE-F="250"]Firma:[/SPALTE-F][COLOR="#FF0000"]\n[/COLOR]
    5. ...
    6.  
    sowas erzeugst
    Code (HTML):
    1.  
    2.     <tr><br>
    3.         <td><br>
    4.  
    Da das nicht erlaubt ist, interpretiert der Browser

    Code (HTML):
    1.  
    2. <!-- entweder -->
    3.     <tr>
    4.         <td>
    5. <!-- oder -->
    6. <br>
    7. <br>
    8. <br>
    9.  
    Hier würde ich mit regex versuchen alle stellen beginnend mit
    Code (PHP):
    1. [tabelle, [zeile, [spalte
    zu suchen und am abschließenden "]" würde ich die \n entfernen.

    PS:
    Du betreibst einen recht großen aufwand um einen simplen parser zu schreiben. Es gibt parser für BB-Code und Markdown unter verschiedensten Lizenzen, ich würde eher sowas empfehlen. Markdown kann Tabellen, ganz simpel:

    Code (HTML5):
    1.  
    2. Kopfspalte 1 | Kopfspalte 2 | Kopfspalte 3
    3. ---|---|---
    4. content s1 | content s2 | content s3
    5.  
    PPS:
    style Anweisungen sollten nach Möglichkeit nicht inline genutzt werden.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •