# automatischer zeilenumbruch...



## blubber (5. März 2002)

Hi, 

ich hab diese Frage zwar schon im html forum gepostet, da ich eigentlich dachte, dass es mit css styles oder sowas lösbar ist, aber vielleicht funzt das ja auch via php. also folgendes:

Ich möchte meine shoutbox so einstellen, dass wenn ein wort das jemand postet nichtmehr in die zeile passt, der automatisch in die nächste zeile springt. Momentan sieht das bei mir so aus: 

<span style="word-break:break-all;word-wrap:break-word"><?=$print[txt]?></span> 

doch so macht er NICHT automatisch einen umbruch, sondern trennt das Wort einfach ab wo es aufhört 

also kann das z.B. so aussehen: 

"Hier ist die Zeile am En 
de, und das ist nicht sch 
ön." 

Was muss ich für den span style schreiben, damit er das automatisch macht bzw. wie kann man das Problem sonst noch lösen?

bye


----------



## sven_raven (5. März 2002)

nach einem wort macht der browser eigentlich standartmäßig nen zeilenwechsel wenn das browserfenster (oder die tabelle) zu klein is


----------



## blubber (5. März 2002)

*ja schon...*

..aber angenommen, EINE Zeile der Shoutbox ist 13 Zeichen lang, wenn nun einer ein Wort schreibt, welches 15 oder 20 Zeichen lang ist, dann verschiebt es mir meine ganzen Tabellen.

Klar, wenn ich den Style einfach weglasse macht er automatisch zeilenumbrüche, aber NUR unter der Voraussetzung, dass KEIN Wort länger ist, als EINE Zeile der Shoutbox.

Und das ist ja mein Problem, wenn eben jemand ein längeres Wort als z.B. 13 Zeichen postet, soll er das Wort trennen, sonst nicht.

*edit*

also wäre sowas wie eine if-abfrage ideal:


```
if (gepostetes Wort länger als 13 Zeichen) 

{ mach Zeilenumbruch im Wort }

else

{ GanzNormal }
```


bye


----------



## Morph (5. März 2002)

puh ich versuchs mal:

```
$text = explode(" ", $shoutBoxText);
$count = count($text);

for ($i=0; i$<$count; $i++)
{
    $laenge = 0; // Var leeren
    $laenge = strlen($text[$i]); // länge des strings zählen
    
    if ($laenge !< 14)
    {
        $teilen = substr ($text[$i], "0", "12");
        $teilen .= "-<br>";
        $teilen .= substr ($text[$i], "13", $laenge);
        $text[$i] = $teilen;
    }
$i++;
}
$text_gesamt = implode (" ", $text);
```
So  Ich glaub zwar, dass das einfacher geht, aber bin ja nochn (relativ gesehen) nen php noob 
Hoffe das es funzt

Grüße, Morph


----------



## blubber (5. März 2002)

*hi,*

keine Ahnung ob das funktioniert, ich weiss nämlich garnet, wie ich das einbauen muss 

also das hier ist meine Ausgabezeile des Textes (html):

<font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#000000">
<?=$print[txt]?>
</font>

und wie soll da nun dein Script einbinden? 

bye


----------



## Morph (5. März 2002)

```
<?php
echo "<font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\" color=\"#000000\">";
// $text = der komplette eingegebene text eines users
$text = explode(" ", $shoutBoxText);
$count = count($text);

for ($i=0; i$<$count; $i++)
{
    $laenge = 0; // Var leeren
    $laenge = strlen($text[$i]); // länge des strings zählen
    
    if ($laenge !< 14)
    {
        $teilen = substr ($text[$i], "0", "12");
        $teilen .= "-<br>";
        $teilen .= substr ($text[$i], "13", $laenge);
        $text[$i] = $teilen;
    }
$i++;
}
$text_gesamt = implode (" ", $text); 
echo $text_gesamt;
echo "</font>";
```
Sooo - könnte gehen  Ich glaub ich teste das mal

Grüße, Morph


----------



## Morph (5. März 2002)

Es funzt tatsächlich 

```
<?php

echo "<font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\" color=\"#000000\">";

// $text = der komplette eingegebene text eines users
$text_exp = explode(" ", $text);
$count = count($text_exp);

for ($i=0; $i < $count; $i++)
{
    $laenge = 0; // Var leeren
    $laenge = strlen($text_exp[$i]); // länge des strings zählen
    
    if ($laenge > 13) // 13 = max länge eines wortes
    {
        $teilen = substr ($text_exp[$i], "0", "12");
        // 12 = max länge eine wortes -1,
        // da ja noch ein bindestrich angehangen wird
        $teilen .= "-<br>";
        $teilen .= substr ($text_exp[$i], "13", $laenge);
        // 13 = nach dem anhängen des bindestrichs und
        // des zeilenumbruchs wird das restliche wort gespeichert
        $text_exp[$i] = $teilen;
    }
}
// fügt die einzelnen Wörter (hier in arrays) wieder
// zusammen und fügt nach jedem neuen wort ein leerzeichen ein
$text_gesamt = implode (" ", $text_exp); 

echo $text_gesamt;
echo "</font>";
?>
```

Grüße, Morph

*Edit: * So, ein paar kommentare hinzugefügt


----------



## blubber (5. März 2002)

*yeah..*

cool man, funzt wunderbar, danke !!
vonwegen "php noob" 

Aber eine Frage hab ich ja doch noch 

Angenommen es kommt ein Spezialist vorbei, und meint, er müsste 100 Zeichen (also ohne leerzeichen dazwischen) eingeben (mehr geht nicht), dann würde dein Script in der ersten Zeile nach 12 Zeichen einen Umbruch machen, doch in der nächsten Zeile nichtmehr, dann wären in Zeile 2 immernoch 88 Zeichen, was auch ein wenig viel wäre 

kurz: Würdest das Script so hinbekommen, dass es über sagen wir 7 oder 8 Zeilen funktioniert? 


Ansonsten echt fett, danke nochmals.

bye


----------



## Morph (5. März 2002)

Ich probiers mal 
Dürfte nicht sooo schwer sein - ma schaun wie lange ich brauch 
Ergebniss folgt schnellstmöglichst

Grüße, Morph


----------



## blubber (5. März 2002)

*bugreport *

Mir sind noch ein paar "Bugs" aufgefallen:

1. Die Regel mit dem Wort das nicht länger sein darf als z.B. 13 Zeichen gilt NUR für die erste Zeile

bsp.: wenn jemand schreibt

"mir geht es heute WUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUNDERBAR"

dann sieht das so aus:

"mir geht es heute
WUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUNDERBAR"

also in Zeile 2 trennt er nicht.




2. Beim trennen killt er einen Buchstaben.

bsp.: wenn jemand schreibt 

"Sauerkrautsalatobst"

dann sieht das so aus:

"Sauerkrautsa-
atobst"

also er hat das "l" von "salat" gekillt.

bye


----------



## Morph (5. März 2002)

Das mit dem abgeschnittenem buchstaben warn fehler von mir, is beseitigt.
So - ich war davon ausgegangen, dass dein input feld keine textarea ist  egal das lässt sich ändern.

Nun meine Frage: gibts nen befehl für das suchen eines bestimmten zeichens ? wenn das zeichen gefunden, dann true sonst false - das wäre ideal

Grüße, Morph


----------



## blubber (5. März 2002)

*...*

Mein feld ist auch keine Textarea, sondern ein kleines input feld, doch man kann 100 Zeichen posten (geregelt durch maxlength="100"), und die stehen dann eben nicht in einer Zeile, sondern in mehreren Zeilen, weil eine Zeile ja nur 13 Zeichen breit ist 

bye


----------



## Morph (5. März 2002)

Hab jetzt gesehn was du meinst - wenn er einmal getrennt hat, dann schaut er nichtmehr, ob der 2te abschnitt des wortes oder allgemein dann länger is als 13 zeichen 
So zum suchen nehm ich ma ereg() ... hab nix besseres gefunden (bin grad am zusammenkleistern )

Grüße, Morph


----------



## blubber (5. März 2002)

*hehe*

alles klar


----------



## Morph (5. März 2002)

```
<?php

echo "<font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\" color=\"#000000\">";

$erg = ereg (" ", $text);

if ($erg)
{
	$text_exp = explode(" ", $text);
	$count = count($text_exp);
        $ok = true;
} else {
	$count = 1;
	$text_exp = $text;
        $ok = false;
}


// $text = der komplette eingegebene text eines users
$text_exp = explode(" ", $text);
$count = count($text_exp);

for ($i=0; $i < $count; $i++)
{
    $laenge = 0; // Var leeren
    $laenge = strlen($text_exp[$i]); // länge des strings zählen
    
    if ($laenge > 13) // 13 = max länge eines wortes
    {
        $teilen = substr ($text_exp[$i], "0", "12");
        // 12 = max länge eine wortes -1,
        // da ja noch ein bindestrich angehangen wird
        $teilen .= "-<br>";
        $teilen .= substr ($text_exp[$i], "13", $laenge);
        // 13 = nach dem anhängen des bindestrichs und
        // des zeilenumbruchs wird das restliche wort gespeichert
        $text_exp[$i] = $teilen;
    }
}
// fügt die einzelnen Wörter (hier in arrays) wieder
// zusammen und fügt nach jedem neuen wort ein leerzeichen ein
$text_gesamt = implode (" ", $text_exp); 

if ($ok)
{
	$text_gesamt = implode (" ", $text_exp); 
} else {
	$text_gesamt = $text_exp;
}

echo $text_gesamt;
echo "</font>";
?>
```
Bin heut echt zu doof das richtig hinzubekommen 
Sorry blubber, aber ich versuchs morgen wieder - heut nützts nichts mehr *snief*

Grüße, Morph


----------



## Matthias Reitinger (5. März 2002)

Ähm... also... ich will jetzt nicht deine ganze Arbeit zunichte machen, Morph, aber... na ja... da gibt's tatsächlich eine Funktion, die das übernimmt 

```
<?
$print[txt] = wordwrap($print[txt], 13, "<br>", 1);
?>
```

HTH


reima

PS: Ich finde, dass das nicht gerade die ultimative Lösung für das anfangs erörterte Problem darstellt... Das müsste schon irgendwie mit CSS machbar sein. Denn wenn du nicht mit einer Schriftart arbeitest, bei der alle Zeichen die gleiche Breite haben, sieht das schnell blöd aus... einmal steht da z.B.
iltiskillerhe
lfer
[und in der nächsten Zeile]
mopedvergaser
anschluss
(Komische Wörter, ich weiß )
Die erste Zeile hat jeweils 13 Zeichen. Und vom Augenmaß her müsste das 'lfer' locker noch in die Zeile darüber reinpassen. Das wird aber abgetrennt, weil sonst mehr als 13 Zeichen in einer Zeile stehen würden. Tja... Aber wenn du damit leben kannst


----------



## blubber (5. März 2002)

*jopa*

np morph 

ja wie würdest du das dann machen reima?


bye


----------



## blubber (6. März 2002)

*..*

ich hab nochmal bei den css funktionen nachgeschaut, aber ausser diese funktionen

<span style="word-break:break-all;word-wrap:break-word">

habe ich nichts gefunden, was annähernd passen könnte. Das mit der Wortlänge von 13 Zeichen soll ja nur ein Schutz sein gegen Leute die meinetwegen "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" posten würden, und es dann die Tabelle verschiebt. Sooo oft kommen Wörter, die länger als 13 Zeichen sind ja auch net vor, und dann macht er ja sowieso automatisch die umbrüche (is ja von html aus so).

Aber wie gesagt, sollte es doch eine perfekte Lösung geben (evtl doch via css), würd ichs gern versuchen 

Mit deinem geschilderten problem, reima, haste schon recht. Doch mit den mir bekannten css styles siehts ja auch net grad besser aus, eher schlechter. Da haut er ja nach jedem Wort am Ende einen Umbruch rein und trennt das Wort ab, egal obs nun kleiner ist als 13 Zeichen oder nicht.

Und wenn ein T
ext dann so au
ssieht wie hie
r, ist das opt
isch auch nich
t gerade sehr g
ut



bye


----------



## Morph (6. März 2002)

reima hat gesagt.:
			
		

> Ähm... also... ich will jetzt nicht deine ganze Arbeit zunichte machen, Morph, aber... na ja... da gibt's tatsächlich eine Funktion, die das übernimmt


Arbeit zunichte machen ? Och wieso - mit jedem Script was ich schreibe gewinne ich an Erfahrung die mir keiner mehr nehmen kann - also von daher empfinde ich so etwas als gewinn und nicht als "Arbeit zunichte machen" 
Außerdem thx, die Funktion kannte ich noch nicht 

@ Blubber: haste das prob mit Reima's code gelöst bekommen ?

Grüße, Morph


----------



## blubber (6. März 2002)

*hi morph*

...nicht wirklich, ich weiss nichtmal, was die funktion machen soll 

den Code, den du gestern gepostet hast, ist das der fertige? Wenn nicht, poste bitte den fertigen code, dann probier ichs 

bye


----------



## Morph (6. März 2002)

Ich bin dabei den Code umzuschreiben - ich versuch mal möglichst schnell fertig zu werde (hab noch n bissl was anderes zu coden )
Ich beeil mich

Grüße, Morph


----------



## Morph (6. März 2002)

```
<?php

echo "<font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\" color=\"#000000\">";

// $text = der komplette eingegebene text eines users
$text_exp = explode(" ", $text);
$count = count($text_exp);

for ($i=0; $i < $count; $i++)
{
    $laenge = 0; // Var leeren
    $laenge = strlen($text_exp[$i]); // länge des strings zählen
    
    if ($laenge > 12) // 13 = max länge eines wortes
    {
        $teilen = substr ($text_exp[$i], "0", "12");
        // 12 = max länge eine wortes
        $teilen .= "-<br>";
        $teilen .= substr ($text_exp[$i], "12", $laenge);
        // 12 = nach dem anhängen des bindestrichs und
        // des zeilenumbruchs wird das restliche wort gespeichert
        $text_exp[$i] = $teilen;
    }
}
// fügt die einzelnen Wörter (hier in arrays) wieder
// zusammen und fügt nach jedem neuen wort ein leerzeichen ein
$text_gesamt = implode (" ", $text_exp); 

echo $text_gesamt;
echo "</font>";
?>
```
Das funzt 100 pro. Nur das problem ist, dass ich bei dem kürzen eines wortes mit z.b. 100 zeichen ohne leerzeichen dazwischen nichtmehr weiterkomme 
Ich hänge mal die "probe" an, vielleicht erbarmt sich ein mod oder sogar reima (ein raunen geht durch die hallen) dazu, dir zu helfen 

Vielleicht fällt mir noch was ein, wie ich das richtig hinbekomme, laube aber im mom nicht dran - sry 

Grüße, Morph


----------



## blubber (6. März 2002)

*....*

Hi,

ok, erstmal danke für deine Bemühungen !!! 
Was du jetzt damit meinst, hab ich allerdings nicht ganz verstanden:

"Nur das problem ist, dass ich bei dem kürzen eines wortes mit z.b. 100 zeichen ohne leerzeichen dazwischen nichtmehr weiterkomme"

bye


----------



## blubber (6. März 2002)

*nachtrag:*

Jup, hab grad das Script von dir probiert, geht astrein. Jetzt weiss ich glaub auch was du gemeint hast, dass es noch nicht funktioniert:
Ein Wort, das länger als 2 Zeilen ist, wird nicht mehrmals getrennt sondern nur einmal.

Aber sonst ist das Script echt cool, danke nochmals.

..und vielleicht kann ja sogar doch noch einer das angesprochene Problem beseitigen...!? 

bye


----------



## Morph (6. März 2002)

bitte bitte ...
Kommt Leutz, helft blubber dochmal - besonders die mods: sollte doch nur ne fingerübung für euch sein 

Grüße, Morph


----------



## Matthias Reitinger (6. März 2002)

Hab das mal nach meiner Art gemacht:

```
function wrap($text, $length)
{
	$x = 0; $i = 0; $zeile[0] = "";	
	while ($i<strlen($text)) 
	{
		$word_len = strpos($text, " ", $i+1) - $i;		
		if ($word_len <= 0) $word_len = strlen($text) - $i;
		if (($word_len + $x) <= $length) {
			$zeile[count($zeile)-1] .= substr($text, $i, $word_len);
			$x += $word_len; $i += $word_len;
		}
		elseif ($x == 0) {
			$zeile[count($zeile)-1] = substr($text, $i, $length);
			$zeile[] = "";
			$i += $length;
		}
		else {
			$zeile[] = "";
			$x = 0;	$i++;
		}
	}	
	return implode("<br>", $zeile);
}


$text = wrap($text, 13);
```

Konnte das ganze auf die Schnelle nicht so extensiv testen, für Trivialfälle funktioniert es recht gut... den Rest überlasse ich euch 
Die Funktion macht jetzt so ziemlich das selbe wie wordwrap(), aber man kann halt kleine Anpassungen und Extras einbauen... Wenn du z.B. Trennstriche willst oder so, oder ihr einen Bug findet, dann sagt es einfach 


reima


PS:


> Ich hänge mal die "probe" an, vielleicht erbarmt sich ein mod oder sogar reima (ein raunen geht durch die hallen) dazu, dir zu helfen


Bin ich wirklich schon so berühmt-berüchtigt hier? ^^ ;-)


----------



## Rev (6. März 2002)

das ist im prinzip genau das was ich mal gesucht hatte.. nur noch ein problem hab ich, falls der user nun eine url eingegeben hat wird diese ja auch "gesplittet" und funktioniert nicht mehr, wie ergänzt man die funktion am besten das der urls erkennt, den "sichtbaren" text am besten kürzt und den "link" in ruhe lässt


----------



## blubber (6. März 2002)

*hi reima,*

..ich hab da noch ein ganz anderes Problem, wie bau ich die funktion nun ein?  (ich kenn mich mit funktionen überhaupt net aus)

also meine "standard-zeile" zur ausgabe des textes momentan sieht so aus:
font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#000000<?=$print[txt]?></font>





> Wenn du z.B. Trennstriche willst oder so...



*will 

bye


----------



## PaRADoX (7. März 2004)

Hi  blubber,
wurde dein Prob gelöst? Wenn ja, wie? Ich habe dasselbe Prob mit meiner Shoutbox.

NACHTRAG:
Also das mit dem Wordwrap haut bei mir net hin, dann werden meine Smilies einfach gekillt!


----------



## PaRADoX (8. März 2004)

Kann mir denn keiner helfen!?


----------



## PaRADoX (9. März 2004)

Hallo? Muss ich extra ein neues Thema eröffnen?


----------

