Regex-Merkwürdigkeit

27apricot

Erfahrenes Mitglied
Hallo,

ich bastel gerade an einer Funktion, die Text aus der Datenbank in HTML überträgt. Dabei möchte ich Zeilenumbrüche nicht durch nl2br() in breaks umwandeln, sondern jeden Absatz zu einem neuen Textabsatz <p>...</p> machen.

Die Funktion:
PHP:
		$suchen = array(
			'~^(.+)\r~', // P: erste Zeile
			'~\n(.+)$~', // P: letzte Zeile
			'~\n(.+)\r~', // P: alle weiteren Zeilen
			'~^(.+)$~', // P: einzelne Zeile
			'~\n\r~', // P: leere Zeile
		);
		$ersetzen = array(
			'<p>\1</p>',
			'<p>\1</p>',
			'<p>\1</p>',
			'<p>\1</p>',
			'<p><br /></p>',
		);
		return preg_replace($suchen, $ersetzen, $text);

Das funktioniert eigentlich prima. Aber nur, wenn es irgendwo im Text eine Leerzeile gibt, also einen doppelten Zeilenumbruch. Gibt es diesen nicht, werden nicht nur die einzelnen Zeilen zu Absätzen gemacht, sondern auch nochmal der gesamte Text.

Beispiel:
Code:
Zeile 1
Zeile 2
wird zu
Code:
<p><p>Zeile 1</p><p>Zeile 2</p></p>
Mit Leerzeile aber:
Code:
Zeile 1

Zeile 2
wird es zu dem gewünschten
Code:
<p>Zeile 1</p><p><br /></p><p>Zeile 2</p>

Ich versteh' Bahnhof.

Vielen Dank im Voraus:
27apricot
 
Probier mal folgende Funktion:
PHP:
function nl2p($string)
{
	$brElement = trim(nl2br(chr(0x0A)));
	$string = preg_replace('/^([\s\t]+$)/m', '', $string);
	$string = '<p>'.nl2br(trim($string)).'</p>';
	$string = preg_replace('/'.preg_quote($brElement, '/').'([\r\n]+)'.preg_quote($brElement, '/').'[\r\n]*/s', '</p>\1<p>', $string);
	return $string;
}
Andernfalls kannst du auch die weit aus umfangreichere wpautop()-Funktion von Wordpress nutzen.
 
Hallo Gumbo,

Vielen Dank für den Tipp. Hab' die Idee in meine Funktion eingebaut und es funktioniert:
PHP:
	function nl2p($text) {
		$text = "<p>".nl2br($text)."</p>";
		$suchen = array(
			'~<br />\r\n~', // break zu paragraph
			'~<p></p>~',
		);
		$ersetzen = array(
			'</p><p>',
			'<p><br /></p>',
		);
		return preg_replace($suchen, $ersetzen, $text);
	}

Schöne Grüße:
27apricot
 
Zurück