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

venom2k6

NGBler
Registriert
15 Juli 2013
Beiträge
91
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
[src=text]
[TABELLE]
[ZEILE]
[SPALTE-F="250"]Firma:[/SPALTE-F]
[SPALTE="500"]Die Firma GmbH[/SPALTE]
[/ZEILE]
[ZEILE]
[SPALTE-F="250"]Sitz der Firma:[/SPALTE-F]
[SPALTE="500"]Musterstraße 2
12345 Musterstadt[/SPALTE]
[/ZEILE]
[ZEILE]
[SPALTE-F="250"]Kontakt:[/SPALTE-F]
[SPALTE="500"]Tel: (+49) 12 34 - 5 67 89
Fax: (+49) 12 34 - 5 67 80[/SPALTE]
[/ZEILE]
[/TABELLE]
[/src]

dieser Pseudo BBCode wird durch eine Funktion in html umgestaltet

Auszug BBCode Funktion in functions.php
[src=php]
function bbcode($textblock) {

#global $textblock;

$text_old = array("[F]", "[/F]", "
", "[OK]", "[H6]", "[/H6]", "[H5]", "[/H5]", "[H4]", "[/H4]",
"[TABELLE]", "[/TABELLE]", "[ZEILE]", "[/ZEILE]", "[SPALTE-F=\"", "[/SPALTE-F]", "[SPALTE=\"", "\"]", "[/SPALTE]");
$text_replace = array("<b>", "</b>", "<hr style=\"width: 300px; border-top: 3px solid #006600; \">",
"<img src=\"img/ico/ok.gif\" alt=\"OK!\" style=\"position:relative; top:2px;\">",
"<div class=\"h6_bbcode\">", "</div>", "<div class=\"h5_bbcode\">", "</div>",
"<span class=\"h4_bbcode\">", "</span>", "<table style=\"margin: 0 0 0 0;\" border=\"0\" cellpadding=\"0\" cellspacing=\"10\" width=\"100%\">",
"</table>", "<tr>", "</tr>", "<th style=\"text-align: left;\" width=\"", "</th>", "<td width=\"", "\">", "</td>");
$text_neu = str_replace($text_old, $text_replace, $textblock);

return $text_neu;
}
[/src]


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
 
Zuletzt bearbeitet:
Anfang und ende kann mit 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.
 

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
[src=pcre]/(*ANY)\n*(\[TABELLE\])/ug[/src]
und als Substitute einfach
[src=pcre]\n$1[/src]
nehmen, ist aber wrsl falsch.
Passende closing wäre dann:
[src=pcre]/(*ANY)(\[\/TABELLE\])\n*/ug[/src]
und dazu als sub die
[src=pcre]$1\n[/src]

EDIT:// (*ANY) und der u-Modifikator dürfen nie fehlen! :)
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #4
also meine Ausgabe erfolgt in meiner imprint.php
[src=php]
<main>
<article>
<header><?php echo utf8_encode(site_out('site_title')); ?></header>
<main>
<?php

$site_text = site_out('site_text');

echo nl2br(bbcode(utf8_encode($site_text)));
?>


</main>
</article>
</main>
[/src]

Das erzeugt laut GChrome Quelltextanzeige folgenden Code Schnipsel
[src=html5]
<article>
<header>Impressum</header>
<main>
<table style="margin: 0 0 0 0;" border="0" cellpadding="0" cellspacing="10" width="100%"><br />
<tr><br />
<th style="text-align: left;" width="250">Firma:</th><br />
<td width="500">Die Firma GmbH</td><br />
</tr><br />
<tr><br />
<th style="text-align: left;" width="250">Sitz der Firma:</th><br />
<td width="500">Musterstraße 2<br />
12345 Musterstadt</td><br />
</tr><br />
<tr><br />
<th style="text-align: left;" width="250">Kontakt:</th><br />
<td width="500">Tel: (+49) 12 34 - 5 67 89
Fax: (+49) 12 34 - 5 67 80</td><br />
</tr><br />
</table>

</main>
</article>
</main>
[/src]
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 :)
 
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
), 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.^^
 
  • Thread Starter Thread Starter
  • #6
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 ^^
 
prinzipiell ist das problem das du mit
[src=php]
[TABELLE]\n
[ZEILE]\n
[SPALTE-F="250"]Firma:[/SPALTE-F]\n
...
[/src]
sowas erzeugst
[src=html4strict]
<table><br>
<tr><br>
<td><br>
[/src]

Da das nicht erlaubt ist, interpretiert der Browser

[src=html4strict]
<!-- entweder -->
<table>
<tr>
<td>
<!-- oder -->
<br>
<br>
<br>
[/src]

Hier würde ich mit regex versuchen alle stellen beginnend mit [src=php][tabelle, [zeile, [spalte[/src] 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:

[src=html5]
Kopfspalte 1 | Kopfspalte 2 | Kopfspalte 3
---|---|---
content s1 | content s2 | content s3
[/src]

PPS:
style Anweisungen sollten nach Möglichkeit nicht inline genutzt werden.
 
Zurück
Oben