Ankündigung

Einklappen
Keine Ankündigung bisher.

Zeilenumbruch in <p> Tag ersetzen durch <br>

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

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

    Hallo zusammen,

    ich möchte in einem HTML String mittels PHP die Zeilenumbrüche mit <br> ersetzen
    HTML-Code:
    <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-Code:
    <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-Code:
    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-Code:
    <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.

    Hab mich dann durch diverse Foren gesucht/gekämpft dabei ist folgendes herausgekommen:
    PHP-Code:
    $text_roh '
    <h1>Testüberschrift1</h1>
    <p>Text text
    </p><p class='
    test'>anfang
    ende</p>
    <h1>Testüberschrift2</h1>
    <p>anfang
    mitte
    ende</p>
    '
    ;

    // Umbrüche vereinheitlichen
    $text_roh str_replace(["\r\n""\r"], "\n"$text_roh);

    $dom = new DOMDocument;
    $dom->loadHTML($text_roh);
    $nodes $dom->getElementsByTagName('p');

    foreach (
    $nodes as $node) {

    $new_text = new DOMText(str_replace("\n""<br>"$node->textContent));
    $node->removeChild($node->firstChild);
    $node->appendChild($new_text);

    }

    echo 
    $dom->saveHTML(); 
    Hier wird das <br> Tag nicht verarbeitet sonder im Browser als Text ausgegeben und Sonderzeichen und Umlaute kommen kryptisch (ü wird als ü ausgegeben)

    Könnte einen Denkanstoß gebrauchen.

    Danke schon mal im Voraus für eure Hilfe
    VG HimDa


  • #2
    Ich würde das mit CSS und nicht mit PHP lösen:

    Code:
    p.test {
        white-space: pre-line;
    }

    Kommentar


    • #3
      Hallo hellbringer,

      danke für deine Antwort.
      es hat fast geklappt.

      die Zeilenumbrüche werden in den <p></p> tags gesetzt nur hab ich dort auch <ul><li> Tags dort wird zwischen den <li>tags auch ein zusätzlicher Umbruch gesetzt somit stehen die einzelnen Listenpunkte weit auseinander
      Dies rührt daher das im CMS in Markdown eingegeben wird und der Parser dann entsprechenden HTML erzeugt. Den Parser möchte ich nicht anfassen da sonst das CMS-System nicht mehr updatebar wird, ohne das ich immer wieder eingreifen muss.

      gibt es eine CSS Anweisung welcher für <p> Tags gilt aber innen liegende <ul><li> Tags ausschließt?

      Danke und Gruß
      HimDa

      Kommentar


      • #4
        für <p> Tags gilt aber innen liegende <ul><li> Tags ausschließt
        Du kannst mit sowas
        Code:
        p ul li { }
        bzw.
        Code:
        p li { }
        die ul li innerhalb von p ansprechen und dort den whitespace wieder auf normal setzen ( https://developer.mozilla.org/de/doc...SS/white-space ) .

        Versuch mal. Das sollte aber im CSS nach dem obigen CSS kommen.
        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          Zitat von HimDa Beitrag anzeigen
          gibt es eine CSS Anweisung welcher für <p> Tags gilt aber innen liegende <ul><li> Tags ausschließt?
          <p> darf kein <ul> enthalten - schau dir mal den erzeugten DOM-Baum an: du wirst feststellen dass der Browser vor <ul> das <p> schließt und <ul> damit kein Kind-Element von <p> mehr ist.

          Kommentar


          • #6
            Zitat von HimDa Beitrag anzeigen
            Hallo zusammen,

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

            $new_text = new DOMText(str_replace("\n", "<br>", $node->textContent));
            $node->removeChild($node->firstChild);
            $node->appendChild($new_text);

            }

            echo $dom->saveHTML();[/PHP]

            Hier wird das <br> Tag nicht verarbeitet sonder im Browser als Text ausgegeben und Sonderzeichen und Umlaute kommen kryptisch (ü wird als ü ausgegeben)

            Könnte einen Denkanstoß gebrauchen.

            Danke schon mal im Voraus für eure Hilfe
            VG HimDa
            Ich frage mich, was du damit bezwecken möchtest. Geht es um den Zeilenabstand oder den Abstand zum nächsten Absatz? Sowas regelt man im Normalfall über die entsprechenden CSS-Eigenschaften wie padding und margin. Außerdem hast du ein Problem damit, daß du nicht durchgängig utf8 verwendest.

            Kommentar

            Lädt...
            X