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

ich hab das DOMDocument mal für ein XML eingesetzt.
wenn ich es richtig in Erinnerung hab muss ich ja dann das ganze HTML zerlegen und später wieder zusammenbauen. das ist mir ehrlich gesagt zu viel Aufwand

komisch das es nicht mit einem "normalen" replace Befehl geht.
ich muss mal eine Nacht drüber schlafen
Danke für eure Hilfe
Ergänzung ()

ach ja, beim Input wäre es noch ein größerer Aufwand oder zumindest ähnlich da ich die Eingabe ja auch Parsen muss um die richtigen Stellen zu finden.
Markdown ist ja gerade deshalb interessant da man Überschriften, Absätze Aufzählungen, ... bereits in der Eingabe einfach und schnell festlegen kann. Das einzige was die meisten stört sind die zwei Leerzeichen damit ein Zeilenumbruch auch tatsächlich generiert wird und diesen wollte ich in der Ausgabe abfangen
 
Zuletzt bearbeitet:
Himmelreich schrieb:
ich hab das DOMDocument mal für ein XML eingesetzt.
wenn ich es richtig in Erinnerung hab muss ich ja dann das ganze HTML zerlegen und später wieder zusammenbauen. das ist mir ehrlich gesagt zu viel Aufwand

Ne, deshalb hat er ja replaceChild verlinkt, damit kannste den Knoten live tauschen.

Ich kann dir jetzt was mit explode oder nen regex baun aber Fakt ist dass es nur eine richtige Art gibt das zu machen, nämlich über domDocument und rekursives durchgehen des dom, du kannst nämlich auch geschachtelte <p> Tags haben, das fängste mit einfachen Lösungen so nicht ab. Wenn du natürlich sagst 'das kann nicht passieren dass die geschachtelt sind'

$a = explode('<p>', $htmlstring);
$newstring=$a[0];
for($i=1;$i<count($a)-1;$i++){
$b = explode('</p>', $a);
if(count($b) >1) {
$newstring .= '<p>'.nl2br($b[0]).'</p>'.$b[1];
} else {
$newstring .= '</p>'.$b[0];
}
}

Setzt vorraus das <p> tags nicht geschachtelt sind und mindestens einer vorkommt. Nicht getestet aber sollte so gehen.
 
Hallo zusammen,

hab mich nach langen mal wieder an DOMDocument herangewagt

Code:
$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();

es klappt nicht.
könnt ihr mal drüberschaun
Das mit replaceChild hab ich nicht hinbekommen

Danke für eure Hilfe
Ergänzung ()

Hab vergessen zu schreiben was nicht klappt:
das <br> Tag wird nicht verarbeitet sonder im Browser als Text ausgegeben und Sonderzeichen und Umlaute kommen kryptisch
ü wird als ü ausgegeben
 
Zuletzt bearbeitet:
Himmelreich schrieb:
das <br> Tag wird nicht verarbeitet sonder im Browser als Text ausgegeben
Mal an der Stelle hier ein nl2br() statt str_replace("\n", "<br>", $node->textContent) versucht?
Ansonsten mal bei der Ausgabe das $dom->saveHTML() durch html_entity_decode() jagen?

Himmelreich schrieb:
und Sonderzeichen und Umlaute kommen kryptisch
Welche Zeichenkodierung nutzt du? Hast du eventuell andere Metadaten ausgegeben, als die Formatierung der PHP-Datei(en), sodass der Browser z.B. versucht ISO-8859-1 als UTF-8 (oder umgekehrt) zu lesen?
 
Zuletzt bearbeitet:
Zurück
Oben