Zeilenumbruch
Marcus
- php
0 Christian Kruse0 Marcus
0 Carsten0 Marcus
0 Oliver Lehmann
Hallo.
Wie erzwinge ich mit PHP einen Zeilenumbruch nach x Zeichen?
Anwendung: Senden von E-Mails mit einer festen Textbreite
Dafür gibt es bestimmt eine einfache Funktion, doch meine selbstgestrickte möchte nicht so recht funktionieren....
Danke im voraus,
Marcus
Hi,
Wie erzwinge ich mit PHP einen Zeilenumbruch nach x Zeichen?
zuerst alle \n entfernen:
$text = ereg_replace("[\n\r]+"," ",$text);
dann alle x Zeichen ein \n hinzufügen:
$aktpos = 0;
$x = 30;
while($aktpos < strlen($text))
{
$text = substr($ext,$aktpos,$x) + "\n" + substr($text,$aktpos+$x);
$aktpos += $x;
}
Dafür gibt es bestimmt eine einfache Funktion, doch meine selbstgestrickte möchte nicht so recht
funktionieren....
AFAIK nicht ;)
mfg
CK1
<img src="http://wwwtech.de/images/banner.jpg" alt="">
http://wwwtech.de/moorhuhn/
zuerst alle \n entfernen:
$text = ereg_replace("[\n\r]+"," ",$text);
Nee, das darf nicht sein, denn bewusst gesetzte Absätze sollen natürlich erhalten bleiben. Daher klappt das nicht.
Marcus
Hallo Marcus,
Dafür gibt es bestimmt eine einfache Funktion, doch meine
selbstgestrickte möchte nicht so recht funktionieren....
einfach nicht, aber ne Funktion:
$text=preg_replace("/(.{0,76}) /","\1\n",$text);
^^ max Zeilenlänge
Gruss,
Carsten
$text=preg_replace("/(.{0,76}) /","\1\n",$text);
^^ max Zeilenlänge
Funktioniert nicht richtig: Es ist zwar keine Zeile länger als die angegebene max. Zeilenlänge, doch dafür habe ich nun zusätzliche Absätze, wo eigentlich gar keine vorgesehen waren.
Ergebnis des übertragenen Textfeldes (Zeilenlänge = 60):
Aber es geht ja nur darum, einen Zeilenumbruch zu
erzweingen. So, jetzt kommt
einer:
Und, wo steht die Zeile
jetzt?
Im Text gab es nur einen Umbruch, nämlich vor dem "Und". Sowohl "einer" als auch "jetzt" hätte noch in die Zeile gepasst.
Woran kann das liegen?
Hi,
$text=preg_replace("/(.{0,76}) /","\1\n",$text);
Funktioniert nicht richtig: Es ist zwar keine Zeile länger als die angegebene max. Zeilenlänge, doch
dafür habe ich nun zusätzliche Absätze, wo eigentlich gar keine vorgesehen waren.
Woran kann das liegen?
Ganz einfach: der RegExp registriert nicht, wenn ein von Hand gemachter Umbruch erfolgt ;)
Vielleicht schafft das Abhilfe:
$text = ereg_replace("(.[^\n]{0,10})[\r\n]{0,1}","\1\n",$text);
Ich habs getestet und bin so schnell nicht auf Schwachstellen gestoßen; (.[^\n]{0,10}) sagt: 11 Zeichen,
soll heißen, die 10 Steht für gewünschte Zeichen in einer Zeile - 1.
mfg
CK1
<img src="http://wwwtech.de/images/banner.jpg" alt="">
http://wwwtech.de/moorhuhn/
Hi Marcus,
... als auch "jetzt" hätte noch in die Zeile gepasst.
Woran kann das liegen?
Das ist ein Fehler im regulären Ausdruck (da habe ich wohl schlampig getestet.)
Der Ausdruch ist ja sozusagen 'andersrum' formuliert als die Aufgabebstellung:
"Ersetzte jedes Leerzeichen nach höchstens 60 Zeichen durch einen Zeilenvorschub."
Dadurch bekommt die letzte Zeile immer einen Zeilenvorschub, auch wenn sie
gar keine 60 Zeichen hat (hier kein Problem). Aber wenn die Zeile nicht mit
einem Leerzeichen endet, dann wird der Zeilenumbruch _vor_ das letzte Wort
gesetzt. Billige Abhilfe: Einfach immer ein Leerzeichen anhängen:
$text=nl2br(preg_replace("/(.{0,59}) /",">\1<\n",$text." "));
Für Zeilenumbrüche im Eingabestring war der Ausdruck so schlichtweg nicht
vorgesehen. Der Ausdruck müsste dafür auch noch die \n matchen:
$text=nl2br(preg_replace("/(.{0,59})[ \n]/",">\1<\n",$text."\n"));
...und Zeichenketten länger als 60 Zeichen ohne Leerzeichen werden davon immer
noch nicht gesplittet.
Gruss,
Carsten
Hi Marcus,
ich habe mal nen altes Programm von mir rausgekramt, und dort fiolgendes gefunden.
//folgende Fkt. bricht den Text nach 72 zeichen immer vor dem letzten Wort um
function formattext ($text) {
//alle woerter kommen einzeln in ein array
$woerter = explode(" ",$text);
$i=0;
$z=0;
while($i<count($woerter)) {
//solange eine worthinzufuegung nicht > 72 ergibt UND noch woerter da sind ODER das wort > 72 zeichen ist
while(((strlen($zeile[$z])+strlen($woerter[$i]))<=71) && $i<count($woerter) strlen($woerter[$i])>71) {
$woerter2 = explode(Chr(13).Chr(10),$woerter[$i]);
//wenn $woerter aus mehreren Vars besteht, dann zerlege diesen Array in Variablen
if(count($woerter2)>1) {
//mache mnach jedem wort wieder eine leerzeile
for($a=0;$a<count($woerter2);$a++) {
$zeile[$z].=$woerter2[$a]." " ;
$text2.=$zeile[$z]."\n";
$z++;
}
$i++;
// damit danach kein absatz ist, loesche den letzten zeilenumruch wieder
$text2 = chop($text2);
$text2.= " ";
}
//wenn das wort>72 zeichen lang ist, dann fange eine neue zeile an, es sei denn
//es ist das 1. Wort
if(strlen($woerter[$i])>71 && $i>"0") $z++;
if(count($woerter2) == 1) {
$zeile[$z].=$woerter[$i]." " ;
$i++;
}
}
// echo "---$z=".$z."---$i=".$i."----".$text2."<br><br>";
$text2.=$zeile[$z]."\n";
$z++;
}
// $text2=str_replace("\n","\n",$text2);
return $text2;
}
Duerfte eigentlich genau das sein was du willst. Viel spass ;-) Kann sein das man da so einiges noch besser loesen koennte. doch dazu habe ich jetzt keine lust ;-)
MfG Olli