<br> statt <p>: umbruch in absatz umwandeln

peejey

Mitglied
Hallo,

nach langer Suche im Web muss ich mich jetzt doch an euch wenden.

Und zwar hab ich einen HTML-Text vorliegen in welchem es nur <br>,<p>,<i>,<b>,<hr> tags gibt. Nun möchte ich aber alle Absätze (<p>) in Umbrüche (<br>) wandeln.

Ich habe das selber mit allen möglichen Varianten versucht, aber das ist gar nicht so einfach, da z.B. ein Absatz mit <p><b></b><i></i></p> optisch gar nicht angezeigt wird.

Hat da wer eine Idee oder Funktion wie man das lösen kann?

lg
 
Vielleicht nicht schön aber es klappt:

PHP:
<?php

$text = "<p><b><i>Ein bisschen Text.</i></b></p>";
if(strlen(strip_tags($text)) > 0) {
	$text = str_replace("<p>", "<br />", $text);
	$text = str_replace("</p>", "", $text);
}

echo $text;


?>
 
Vielleicht nicht schön aber es klappt:

leider nicht.

zur erklärung:
der text wurde im prinzip über einen stark abgespeckten wysiwyg-editor (nur mit fett, kursiv und hr-trennlinie) eingegeben und im style-sheet war das p-element auf margin und padding: 0px eingestellt. daher sieht der umbruch in html genau so aus wie der absatz.

ich habe jetzt eine funktion die diesen einfachen html-text graphisch darstellen soll. diese funktion gibt es schon, aber es gibt halt für den umbruch nur eine funktion, daher brauche ich die genaue umwandlung der absätze in einen umbruch.

das problem ist halt, dass man nicht einfach das </p>-tag oder das <p>-tag gegen ein <br> tauschen kann, weil die absätze ein paar eigenheiten haben.

Beispiel:
<p>&nbsp;</p> -> benötigt eine Zeile Platz
<p> </p> -> benötigt KEINEN Platz
<p></p> -> benötigt auch KEINEN Platz

einfach mal selber probieren:


PHP:
$text="a<p></p>b";

echo $text;


und zwischen dem <p></p> setzt ihr einmal ein maskiertes leerzeichen (&nbsp;), einmal ein normales leerzeichen und einmal nichts ein.
 
PHP:
function p2br($hit)
{
  $trim = trim($hit[1]);
  if(empty($trim) === true) return $hit[0]; 
  if($hit[1] === '&nbsp;') return $hit[0];
  return $hit[1].'<br />';
}

 $text = '<P id="TEST">&nbsp;</P>';
 $expr = '/<p.*>(.*)<\/p>/i';
 $repl = preg_replace_callback($expr, "p2br", $text);
 
 echo htmlspecialchars($repl);

Je nachdem, halt noch erweitern.

Edit: Grad gesehen das bei "&nbsp;" eine statt keine Zeile steht, im Prinzip ändert sich an der Idee aber nichts.
 
Zuletzt bearbeitet:
danke für die antwort.
irgendwas stimmt da aber noch nicht.
zum beispiel wenn ich als beispiel-text folgendes verwende:
PHP:
$text = "a<p>b</p>c<p>d</p>e";
 
PHP:
function p2br($hit)
{
  $content = strip_tags($hit[0]);
  $trim = trim($content);
  if(empty($trim) === true) return ''; 
  if($content === '&nbsp;') return '<br />';
  return $content.'<br />';
}


 $text = 'a<p>b</p>c<p>d</p>e';
 $expr = '#[<p.*]+[^<]+[<\/p>]+#';
 $repl = preg_replace_callback($expr, "p2br", $text);
 
 echo htmlspecialchars($repl);

kurz nochmal drübergeschaut, kann man bestimmt noch effizienter machen.
 

Neue Beiträge

Zurück