• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

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

venom2k6

NGBler

Registriert
15 Juli 2013
Beiträge
107
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:

KingJamez

Aktiver NGBler

Registriert
18 Juli 2013
Beiträge
501
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.
 

darksider3

NGBler

Registriert
18 Sep. 2013
Beiträge
393
Ort
/dev/sda
@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
[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:

venom2k6

NGBler

Registriert
15 Juli 2013
Beiträge
107
  • 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 :)
 

darksider3

NGBler

Registriert
18 Sep. 2013
Beiträge
393
Ort
/dev/sda
@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
), 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.^^
 

venom2k6

NGBler

Registriert
15 Juli 2013
Beiträge
107
  • Thread Starter Thread Starter
  • #6
@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 ^^
 

KingJamez

Aktiver NGBler

Registriert
18 Juli 2013
Beiträge
501
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.
 
Oben