Umbrüche mit Zusatz suchen & ersetzen

Pinky

Erfahrenes Mitglied
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
DIE LÖSUNG GANZ UNTEN
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *


Liebe Leute von heute,

ich habe mir ein kleines Script geschrieben dass es erlaubt, über gewisse Bilder einen Code im Textfeld einzugeben (wie hier oben). Das heisst zum Beispiel für einen fetten Text kann das Bild "F" angecklickt werden und dan wird der markierte Text mit umklammert. Gut, das funktioniert auch alles so weit.

Nun habe ich zwei Aufzählungsbilder. Das eine hat einen Einzug von 40px, das andere Bild bewirkt, dass der Aufzählungstext auf 100px eingerückt wird. Beide Aufzählungszeichen werden zur Anzeige auf der Webseite in <ul><li></li></ul> umgewandelt. Der einzige Unterschied besteht darin, dass das zweite <ul> wie folt aussieht: <ul style="margin-left:100px;">.

Da ich nun im Textfeld, wo ich die Aufzählung gefinieren kann die Felder [ul] und [li] einfüge und der Benutzer diese jeweils auf eine eigene Zeile setzt, ergibt sich auf der Anzeigeseite einen zu grossen Abstand zwischen den Aufzählungspunkten. Als Beispiel:
Eingabe im Textfeld
[ul]Erste Ebene[/ul]
[li]Zweite Ebene[/li]
[li]Zweite Ebene[/li]

Der Quellcode der Ausgabeseite sieht dan wie folt aus:
<ul><li>Erste Ebene</li></ul>
<ul style="margin-left:100px;"><li>Zweite Ebene</li></ul>
<ul style="margin-left:100px;"><li>Zeite Ebene</li></ul>

Da ich nun aber in der Eingabe im Textfeld jeweils einen Umbruch nach [/ul] bwz [/li] gemacht habe, sieht die Anzeige im Browser wie folgt aus:
Erste Ebene

Zweite Ebene​

Zweite Ebene​


Nun habe ich versucht, nach [/li]+dem Umbruch zu suchen! Folgendes Skript soll mir dabei helfen, doch es funktioniert leider nicht:

PHP:
$text = str_replace(array("\[/li\]\r\n", "\[/li\]\n", "\[/li\]\r"), "", $text);

Nun meine Frage, wie kann ich nach [/ul] & [/li] den Umbruch löschen?

Herzlichen Dank
Euer Pinky
 
Zuletzt bearbeitet:
Du möchtest die Ausgabe bestimmt so haben?

HTML:
<ul><li>Erste Ebene</li></ul>
<ul style="margin-left:100px;">
   <li>Zweite Ebene</li>
   <li>Zeite Ebene</li>
</ul>
 
Hallo,

das wäre natürlich Wünschenswerd, doch sehe ich leider keine Weg, dies so hinzubekommen. Wie gedenkst du dies zu lösen, ohne dass ich um die [li] eine neue Funktion (zb) [ul2] schreiben muss?

Nach Abständen kann ich suchen, das hat geklappt, doch kombiniert mit der Endung [/li], das hat leider nicht geklappt. Evt. findet ihr den Fehler im oberen Skript.

Wie sollte ich es abändern?

Herzlichen Dank
Pinky
 
Warum änderst du es nicht schon, wo du die Ausgabe zusammen baust. Poste doch mal bisschen Quelltext.
 
Ok, das ist eine gute Idee!

Folgende Funktion sollte den Zeilenumbruch nach [/li] löschen (tut es aber nicht):
PHP:
function klammern($a)
{
	$text = $a;
	$text = str_replace(array("\[/li\]\r\n", "\[/li\]\n", "\[/li\]\r"), "", $text);
	return $text;
}

Mittels folgendem Skript schreibe ich den Text in die Datenbank (vereinfacht). Und hier soll die obige Funktion angewendet werden und der Zelienumbruch nach [/li] gar nicht mehr erst in die DB eingetragen werden:
PHP:
$sql = 	"INSERT INTO `dbname`
			(`id`,`titel`,`text`) VALUES
			('','".$_POST[titel]."','".klammern($_POST[text])."')";
mysql_query($sql);

Folgende Funktion wandelt den Code in die gewohnten Tags wider um:
PHP:
function bbcodeumwandeln($a)
{
	$text = $a;
	$text = eregi_replace('\[b\]','<b>',$text);
	$text = eregi_replace('\[/b\]','</b>',$text);

	$text = eregi_replace('\[ul\]','<ul><li>',$text);
	$text = eregi_replace('\[/ul\]','</li></ul>',$text);

	$text = eregi_replace('\[li\]','<ul style="margin-left:100px;"><li>',$text);
	$text = eregi_replace('\[/li\]','</li></ul>',$text);

	return nl2br($text);
}

Ich hoffe dies hilft euch ein bisschen! Wenn ihr so spontan noch bessere schreibweisen für meinen Code habt, so bin ich gerne bereit, von euch zu lernen.

Herzlichen Dank für euere Mühe & seit lieb gegrüsst
Pinky
 
Zuletzt bearbeitet:
würde sagen so

PHP:
    $text = eregi_replace('\[ul\]','<ul  style="margin-left:100px;">',$text);
    $text = eregi_replace('\[/ul\]','</ul>',$text);

    $text = eregi_replace('\[li\]','<li>',$text);
    $text = eregi_replace('\[/li\]','</li>',$text);
 
Hallo Kalle,

danke für deine Idee. Funktionieren würde das grundsätzlich, doch leider ist es nicht das was ich suche! Ich möchte, dass der User zwischen zwei Aufzählungszeichen wählen kann. Das erste ist die 1ste Ebene, dass heisst ganz links! Das zweite ist die 2te Ebene, das heisst, der Eintrag soll von links um 100px eingezogen werden.

Da ich die Codes im Textfeld ([b], [ul], [li] usw.) möglichst einfach halten will (sind auch nicht super Computerfreaks am Werk) will ich nicht, dass Sie zwei Codes einfügen müssen. Also z.B zuerst [ul] und je nach dem ob sie erste oder zweite Ebene wollen [ebene1] resp. [ebene2].

Ich versuche das so zu lösen, dass wenn er die erste Ebene will, dann kommt [ul] um den Text, und wenn er die zweite Ebene will, dann kommt [li] um den Text. Da <li> aber nicht alleine stehen kann (ohne <ul>) muss ich ja ein <ul> drumherum bauen.

Das Problem liegt aber nicht in der Umwandlung der [ul], [li] usw. Codes sondern am Abstand, der nach einer Aufzählung im Textfeld gemacht wird.

Beispiel wie das Textfeld aussehen könnte (Variante #1)
[ul]Ebene 1 - Punkt 1[/ul]
[li]Ebene 2 - Punkt 1[/li]
[li]Ebene 2 - Punkt 2[/li]

Ich will nicht, dass der Bentutzer den Text wie folgt eingeben muss (Variante #2)
[ul]Ebene 1 - Punkt 1[/ul][li]Ebene 2 - Punkt 1[/li][li]Ebene 2 - Punkt 2[/li]

Da ich den Text in der Webseitenanzeige mittels nl2br()- Funktion ausgebe, gibt es mir mit der Variante #1 einfach zu grosse Abstände, da er nach den [/li] jeweils noch einen Zeilenumbrich in die Datenbank schreibt. Doch diesen Zeilenumbruch möchte ich löschen.

Alle Zeilenumbrüche konnte ich bereits aus dem Textfeld löschen, doch das ist nicht Sinn der Sache. Ich will nur jene gelöscht haben, die unmittelbar nach einem [/li] stehen. Dazu habe ich den Code verwendet, den ich in meinem letzen Post geschrieben habe.

Ich hoffe das Problem ist so verständlich & jemand der dies liest hat direkt eine Lösung im Ärmel. Das wäre super toll.

Herzlichen Dank & lieber Gruss
Pinky
 
Zuletzt bearbeitet:
Hallo & Danke für die Antwort,

das habe ich bereits Probiert, mittels CSS den Abstand zu nehmen, doch nicht der Abstand aus CSS ist das Problem, sondern der Zeilenumbruch, der nach dem Eintarg [/li] von den Benutzern gemacht wird.

Die Zeielnumbrüche, die der User macht markiere ich rot! Diese Reissen auch meine Anzeige so weit auseinander

[ul]Erste Ebene[/ul] Zeilenumbruch
[li]Zweite Ebene - Erster Punkt[/li] Zeilenumbruch
[li]Zweite Ebene - Zweiter Punkt[li] Zeilenumbruch

Jemand eine Idee?
Gruss
Pinky
 
Ok, anscheinend ist das nicht so einfach wie ich es mir vorgestellt habe. Ich habe es nun so gelöst, dass ich für ul im .CSS- File einfach Minuswerte setze.

Aber irgendwie finde ich das nicht so eine Super saubere Lösung, denn wenn einer mal den Zeilenabstand vergisst, dann sieht das schrecklich aus.

Gibt es wirklich keine möglichkeit, mittels nachstehender Funktion den Eintrag [/li] mit dem unmittelbar folgendem Zelienumbruch zu löschen?

PHP:
str_replace

Lieber Gruss & Danke für jede bissherige Antwort
Pinky
 
Zurück