Hilfe beim BR entfernen bei meinen BBCode

Kalma

Erfahrenes Mitglied
Hallo,

sry für die viele Fragerei, aber ich arbeite an einem großen Projekt. Da muss ja alles laufen ;)

Also, ich habe BBCodes (Wiki-Style).
Dort habe ich eine Funktion für eine <h2>, die sieht so aus
Code:
=== Überschrift ===

Und ne Funktion für <p>
Code:
~~Absatz~~

Jetzt habe ich folgendes Problem.
H2 und Absatz müssen bündig abschließen, dass heißt, keine <br /> oder sonstige Codes, die eine Lücke erzeugen könnten.

Wenn ich nun mache:
Code:
===Willkommen===

~~ Hallo~~

Macht er natürlich wegen des nl2br Tags, der ganz am Ende steht, 2 <br /> Tag darein.


Anderes Beispiel, eine Tabelle sieht bei mir so aus
Code:
{|
| 1. Spalte oben (links) || 2. Spalte oben (rechts)
|- 1. Spalte links unten || 1. Spalte links unten
|}
Jetzt macht er vor jedem </td> ein <br /> rein, ist ja klar, da ist ja auch ein Absatz.
Desto mehr Leerzeichen der Autor macht, desto größer und zugleich hässlicher wird natürlich die Tabelle und der gazne Text.


Wie kann ich sinnvoll aus den Elementen die <br> rausfiltern?

//Habe es so versucht:
PHP:
		// Unwichtige <br /> Entfernen
		$search2[]	= "/<\/h2>(.*)\~\~/i";

		$replace2[]	= '</h2>~~';

		$text		= preg_replace($search2, $replace2, $text);
Aber er entfernt nichts...

mfG
David
 
Zuletzt bearbeitet:
Hallo,
also ich muss gestehen so richtig schlau werde ich aus deinem Beitrag nicht. :rolleyes:
Eventuell hilft dir ja folgender Codeschnippsel weiter:
PHP:
<?php
    function bbcode($string){
        $string = preg_replace('/===(.*)===/i', '<h2>$1</h2>', $string);
        $string = preg_replace('/~~(.*)~~/i', '<p>$1</p>', $string);
        $string = nl2br($string);
        return $string;
    }

    $string = '===Willkommen===

~~ Hallo~~';

    echo bbcode($string);
?>

mfg
forsterm
 
ne,

ich versuche es noch einmal...

Also, ich habe wie gesagt BBCodes,

=== Überschrift ===
Erzielt die folgende wirkung:
HTML:
<h2>Überschrift</h2>

~~Absatz~~
Erzielt diese Wirkung
HTML:
<p>Absatz</p>


-----------------------------------------------------------------


Jetzt habe ich ein großes Textfeld (ähnlich Wikipedia) wo der User den kompletten Inhalt einer Seite ändern kann.
Damit keine Lücke zwischen <h2> und <p> entsteht, muss der User folgende Eingabe machen:

Code:
=== Überschrift === ~~ Absatz ~~
Dann kommt aus dem HTML Code:
HTML:
<h2>Überschrift</h2> <p>Absatz</p>
So schließt halt der Grüne BG Balken der h2 mit dem Hellgrünen BGBalken des p genau ab.

Wenn der user eingibt:
Code:
=== Überschrift ===


~~ Absatz ~~
MAcht der nl2br Tag nun mal einen Absatz zwischen den Beiden Elementen.
Das will ich verhindern, indem ich alles zwischen dem Ende von </h2> und <p> herausfiltere.
 
Auf die Schnelle würde mir ein einfaches preg_replace vor allen anderen Umwandlungen einfallen:
PHP:
preg_replace("=--(.*)--([\n]*)~~(.*)~~=Uis", "<h2>\$1</h2><p>\$3</p>", $content);

(Ist höchstwahrscheinlich schneller als nach der ersten Umwandlung erst wieder zurückzuwandeln...) Oder du schreibst deine new line to <br /> Funktion selbst und überprüfst, ob vor dem lesbaren Text, der dann folgt, nicht eventuell ein Paragraph geöffnet wird. Ist aber wohl doch ein Stückchen komplizierter als der einfache Regex oben...
 
Also ich habe jetzt folgendes geschafft:

PHP:
		// Unwichtige <br /> Entfernen
		$match 		= "/<\/h2>(.*)<p.*>/i"; 
		$ergebnis 	= "</h2><p>";
		$text		= preg_replace($match, $ergebnis, $text);

Aber jetzt macht er nach dem Anfang von <p> einfach den Text wech :D
Wieso?
 
Der Regex ist hungrig... Entweder
PHP:
$match = "/<\/h2>(.*)<p.*?>/i";
// oder
$match = "/<\/h2>(.*)<p.*>/ui";
// oder
$match = "/<\/h2>(.*)<p[^>]*>/ui";
Würde dennoch den von mir angebotenen Regex benutze, da du dir somit einen zweiten Durchlauf ersparst. Der mag zwar auch nicht perfekt sein, aber du brauchst dadurch nicht mehr mit einem zweiten regex alles zurechtfummeln.
 
Danke Danke Danke,

es funktioniert.
Allerdings brauche ich glaub ich sowieso einen 2. Durchgang, da ich alle <br> vor einem </td> entfernen muss.
Ein Tabellencode sieht bei mir so aus:

Code:
<td valign="top"> Name </td><td valign="top"> David*****<br>
<br></td></tr><tr> <td valign="top">Bankleitzahl: </td><td valign="top"> ********* Volksbank Nottuln eG<br>
<br></td></tr><tr> <td valign="top">Kontonummer:  </td><td valign="top">************<br>
<br></td></tr><tr> <td valign="top">Verwendungszweck: </td><td valign="top"> Spende fuer Fifa World<br>

Ganz viele unnötige Br's die entfernt werden müssen..... :(
 
Ach, Hallo nocheinmal.

Tabellen wurden nun auch gereinigt.


Jetzt allerdings, wenn ich folgenden Text eingebe, macht er die Ausgabe
Hallo

Hallo
------------

Ausgabe:
Hallo <br>
<br>
<br>hallo

Wie mach ich das, dass er nur einmal <br> macht?


//Edit
Hat sich erledigt.
Dieser ganze Thread war überflüssig.
Ich hätte nur den nl2br Tag rausnehmen müssen
 
Zurück