2009-05-03 6 views
11

Ich entwickle eine single serving site in PHP, die einfach Meldungen anzeigt, die von Besuchern (im Idealfall rund um das Thema der Website) gepostet werden. Jeder kann bis zu drei Nachrichten pro Stunde posten.Entfernen redundanter Zeilenumbrüche mit regulären Ausdrücken

Da die Website nur eine Seite sein wird, möchte ich die vertikale Länge jeder Nachricht steuern. Ich möchte jedoch Zeilenumbrüche in der ursprünglichen Nachricht zumindest teilweise beibehalten. Ein Kompromiss wäre, zwei Zeilenumbrüche zuzulassen. Wenn es jedoch mehr als zwei Zeilenumbrüche gibt, ersetzen Sie sie durch insgesamt zwei Zeilenumbrüche in einer Zeile. Stack Overflow implementiert dies.

Zum Beispiel: "Porcupines \ Nare \ n \ n \ n \ nporcupiney"

würde

"Porcupines < br /> sind < br /> < br /> porcupiney." Geändert werden

Ein schwieriger Aspekt beim Überprüfen auf Zeilenumbrüche ist die Möglichkeit, dass sie gesammelt und als \ r \ n, \ r oder \ n gespeichert werden. Ich dachte darüber nach, alle Zeilenumbrüche mit nl2br() in < umzuwandeln, aber das schien unnötig.

Meine Frage: Mit regulären Ausdrücken in PHP (mit Funktionen wie preg_match() und preg_replace()), wie kann ich nach Instanzen von mehr als zwei Zeilenumbrüche in einer Zeile (mit oder ohne Leerzeichen zwischen ihnen) und dann ändern Sie sie auf insgesamt zwei Zeilenumbrüche?

Antwort

30
preg_replace('/(?:(?:\r\n|\r|\n)\s*){2}/s', "\n\n", $text) 
+0

Danke Chaos! Das funktioniert genau wie gewünscht. Deine ursprüngliche Antwort hat auch funktioniert. – tevan

+0

Die ursprüngliche Antwort hat Ihr Kriterium "mit oder ohne Leerzeichen zwischen ihnen" nicht erfüllt. :) – chaos

+0

Aber wenn es nur einen Zeilenumbruch gibt, ändert es sich in zwei? Sollte es nicht eine einzige Pause bleiben wie es ist? – NonCoder

6

So etwas wie

preg_replace('/(\r|\n|\r\n){2,}/', '<br/><br/>', $text); 

funktionieren sollte, denke ich. Obwohl ich mich nicht mehr genau an die PHP-Syntax erinnere, könnte es noch etwas mehr Platz benötigen: -/

+0

Danke David. Das einzige Problem, das ich mit dem von Ihnen geposteten regulären Ausdruck sehe, ist, dass es keine Leerzeichen zwischen Zeilenumbrüchen enthält. – tevan

+0

Ah, stimmt ... Ich habe den Teil Ihrer Frage vermisst, in dem Sie Leerzeichen zwischen Zeilenumbrüchen erwähnt haben. –