PHP Zeilenumbruch in <p> Tag ersetzen durch <br>

Himmelreich

Cadet 3rd Year
Registriert
Dez. 2018
Beiträge
40
Hallo zusammen,

ich möchte in einem HTML String mittels PHP die Zeilenumbrüche mit <br> ersetzen
HTML:
<h1>Testüberschrift1</h1>
<p>Text text
</p><p class='test'>anfang
ende</p>
<h1>Testüberschrift2</h1>
<p>anfang
mitte
ende</p>

und daraus soll folgendes werden:
HTML:
<h1>Testüberschrift1</h1>
<p>Text text<br></p><p class='test'>anfang<br>ende</p>
<h1>Testüberschrift2</h1>
<p>anfang<br>mitte<br>ende</p>

hab es mal mit folgendem probiert komm aber nicht weiter
PHP:
preg_replace('/(<p[^>][I]>)(.[/I])(\n)(.*)(</p>)/', '\1\2<br>\4\5', $html_string);

er beachtet die <p> mit zwei Umbrüchen nicht, folgendes ist mein momentanes Ergebnis
HTML:
<h1>Testüberschrift1</h1>
<p>Text text<br></p><p class='test'>anfang<br>ende</p>
<h1>Testüberschrift2</h1>
<p>anfang
mitte
ende</p>

Mir ist klar das meine Filtereinstellungen so nur einen Zeilenumbruch beachten, weiß aber nicht wie ich es ändern soll damit es korrekt funktioniert.

Könnte einen Denkanstoß gebrauchen.

Danke schon mal im Voraus für eure Hilfe
VG Himmelreich
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: new Account()
Du hast die Forumsbox kaputt gemacht :D
817419
 
  • Gefällt mir
Reaktionen: bog, steff0rn, herliTz_234 und 7 andere
Gut zu wissen, dass HTML Tags in Überschriften funktionieren. 😂
Annotation 2019-09-02 155741.png
 
  • Gefällt mir
Reaktionen: NeoExacun und Nilson
In der Forumsübersichtlich Desktop-PC hat es keinen Einfluss
Habt ihr einen Vorschlag für meine Frage?
 
<?PHP
echo ("<br>");
?>

Oder alles mit PHP ausgeben:

<?PHP
echo ("<h1>Testüberschrift1</h1>
<p>Text text<br></p><p class=\'test\'>anfang<br>ende</p>
<h1>Testüberschrift2</h1>
<p>anfang
mitte
ende</p>");
?>
Drauf achten, dass du die ' entschärfen musst damit das Echo es richtig erkennt. ( Kann sein das es nur für " gilt, aber probiere es einfach aus. )
 
Das HTML kommt fertig aus einem CMS und ich muss es nachformatieren deshalb hilft mir dein Ansatz leider nicht weiter.
Danke aber für deine Antwort
 
Einfach wäre:
PHP:
$str = str_replace(PHP_EOL, '<br>', $str);
So bekommen aber auch die H-Tags einen zusätzlichen Umbruch, was natürlich nicht richtig ist.
Vielleicht hilft's ja trotzdem falls die Konstante noch nicht bekannt war... :)
 
Hallo Sparta8,
Danke für diene Antwort.
Vielleicht muss ich etwas weiter ausholen:
Das HTML erhalte ich als Inhalt von Variablen aus einem Modul dieses CMS. Mehrere dieser Modulvariablen werden dann in das bereits fertige Template in den Inhaltsbereich <body> übergeben. ich erzeuge daraus nicht selbst die Seite sondern das CMS, ich beeinflusse nur noch wie der Inhalt formatiert wird.
Mir erschließt sich momentan nicht wie der Link mir dabei helfen kann.
VG Himmelreich
 
PHP:
$str = str_replace('</h2><br>', '</h2>' . PHP_EOL, str_replace('</h1><br>', '</h1>' . PHP_EOL, str_replace(PHP_EOL, '<br>', $str)));

Und hier anstatt der einzelnen str_replaces für die Tags eine universelle regex mittels preg_replace verwenden.

Dann müsste es klappen.
 
Hallo eri,
das mit PHP_EOL ist mir zwar bekannt aber in diesem Zusammenhang gar nicht in den Sinn gekommen.
Wie bekomm ich da einen Filter zustande der es nur auf <p> Tag Inhalte anwendet

Hallo Nixdorf
die Funktion hab ich schon getestet, macht überall <br> rein wo im Quelltext ein Umbruch ist hab´s nicht hinbekommen dies nur auf den Inhalt von <p> Tags zu beschränken.
Ergänzung ()

Hallo eri,
das Problem ist das in diesem HTML nicht nur <h1>, <h2> und <p> auftauchen sondern alle möglichen HTML tags
Ein Filter der nur den Inhalt aller <p> tags beachtet, wäre meine lösung
 
Himmelreich schrieb:
macht überall <br> rein wo im Quelltext ein Umbruch ist
Der Anfang deiner Anfrage verlangt aber genau das. Dass du nur einen Teil der Zeilenumbrüche ersetzen willst, motivierst du dann nicht textuell, sondern nur im Beispiel. Zuverlässig kannst du dann das nur so lösen, wie es @Sparta8 empfiehlt. Alles andere sind halbe Lösungen, die dir dann irgendwann Fehler produzieren.
 
nl2br macht aber leider auch zwischen den tags ein <br> rein
z.B. so
<p></p><br><h1></h1>
das zerschießt mir dann alles
ich brauch nur innerhalb der <p></p> tags die Ersetzung der Zeilenumbrüche \n durch <br>
 
Woher zieht dein CMS denn die anderen Tags? Oder sind die "Hardcode" in den Templates und die zugefütterten Elemente kommen vollends unformatiert aus der Datenbank und die jagst sie quasi mit jeden Aufruf durch die Formatierung durch PHP? Ist es da nicht sinnvoller woanders anzusetzen - dort wo die Inhalte generiert werden. Das was du vor hast, ist ehrlich gesagt ziemliches Gefrickel.
 
Im Grunde such ich eine Möglichkeit den Inhalt nur von den <p></p> tags zu verändern
auch Ideen wie folgt:

PHP:
preg_replace('/(<p[^>][I]>)(.[/I])(<\/p>)/', '\1'.nl2br("\2").'\3', $html_string);

hatte ich im Sinn aber leider nicht erfolgreich

noch eine Anmerkung zur Anzeige der PHP Code hier:
* werden teils als [ I ] ausgegeben
Ergänzung ()

hallo kachiri,
im Grunde läuft über die Kundeneingabe ein Markdown Parser der Umbrüche nur mit zwei Leerzeichen akzeptiert.
ich könnte den Parser ändern aber dann ist das System nicht mehr updatefähig und ich muss nach jedem update wieder eingreifen. Dem kunden will ich es einfacher machen wenn er einen Umbruch im Backend eingibt soll dieser auch im Frontend angezeigt werden.
 
Zunächst mal:
Wieso nimmst du dann den Text nicht vor dem Parser und ersetzst die doppelten Umbrüche durch p-Tags?

So geht es nicht:
Die "Idioten-Lösung" für dein konkretes Beispiel ist sowas hier:
PHP:
// normalize line breaks
$input = str_replace(["\r\n", "\r"], "\n", $input);
// replace line breaks not following closing tag end delimiters
$output = preg_replace('/([^>])\n/', '\1<br>', $input);
Das wird dir aber ganz schnell um die Ohren fliegen!

Logisch korrekt kannst du das wie gesagt mit simplen regulären Ausdrücken nicht machen. Es gibt ja auch verschachtelte p-Tags und so weiter. Um so etwas sauber zu lösen, benötigst du einen HTML-Parser.

Thema PHP_EOL
Das an dieser Stelle zu benutzen, ist keine gute Idee. Die Konstante enthält immer nur die auf dem aktuellen System gültige Zeichenkette. Die anzupassenden Zeichenketten können aber von überall her kommen. Da her sollte man Zeilenumbrüche immer auf "nur Newline" normalisieren, wie es oben zu sehen ist.
 
Zurück
Oben