Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

Zeilenumbruch erzwingen (Wordwrap)

Hallo,

ich programmier gerade u.A. mit PHP ein Communitysystem. Dort können die User auch selbstständig Kommentare posten. Diese werden alle mit PHP untereinander in einer Tabelle aufgelistet, gespeichert wird alles in MySQL.

Es gibt ja immer wieder I.dioten, die HTML-Tags oder Superultralangewörter posten. Die HTML-Tags filtert PHP wunderbar raus, allerdings macht mir der Wordwrap Probleme:

Man kann maximal 400 Zeichen posten, jedoch können nur ungefähr 40 in einer Zeile angezeigt werden (je nach Usernamenlänger verschieden). Sollte jemand auf die Idee kommen, ein sehr langes Wort zu posten, streckt sich die Tabelle und damit das ganze Design der Seite.
Ich habe es zuerst mit der PHP-wordwrap()-Funktion versucht, doch die hilft mir nicht weiter. Anschließend habe ich mit einer PHP-Schleife nach JEDEM Zeichen eine Sollbruchstelle (&shy;<wbr>) eingefügt (Opera kennt nur &shy;, Firefox nur <wbr> -_-). Allerdings wurden dann sämtliche, auch normal gepostete Texte, mitten im Wort umgebrochen, anstatt an den Leerzeichen.

"word-break:break-all" und Co funktionieren ja nur im IE, da es aus dem Hause Microsoft kommt, und ist somit ebenfalls nutzlos.

Nun die Frage:
Gibt es irgendeine - außer die oben genannten - Möglichkeit mittels HTML, CSS, JS oder PHP einen Zeilenumbruch zu erzwingen, wenn ein Wort den Rahmen sprengen würde?

Mit freundlichen Grüßen


Antworten zu Zeilenumbruch erzwingen (Wordwrap):

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hi |

Mich würde interessieren, warum wordwrap() bei dir nicht funktioniert. Das wäre aus meiner Sicht schon das Werkzeug der Wahl. Hast du mal ein Snippet?

Auch nicht zu verachten ist der Ansatz mit Soft Hyphenation (&shy;). Falsch ist die Aussage zum Firefox: Ab Version 3 unterstützt dieser die Entity &shy;. In Sachen Abwärtskompatibilität ist das natürlich ungünstig. Genau darum macht es Sinn, Zwangsumbruch auf den Server zu verlagern, um ein möglichst einheitliches Resultat auf allen Browsern zu erreichen.

greez 8)
JoSsiF

Falsch ist die Aussage zum Firefox: Ab Version 3 unterstützt dieser die Entity &shy;.

Das kann ich nicht bestätigen. Wenn ich nur &shy; verwende, bricht Firefox nichts - Opera jedoch schon. Firefox versteht nur <wbr>, was Opera allerdings nicht kennt.

Mich würde interessieren, warum wordwrap() bei dir nicht funktioniert. Das wäre aus meiner Sicht schon das Werkzeug der Wahl.

wordwrap() macht was, aber leider nicht das, was ich will. Beispiel:
echo wordwrap($str, 40, "&shy;<wbr>", 1);Nach jedem 40. Zeichen wird eine Sollbruchstelle eingefügt. Klingt gut - trifft wordwrap() allerdings bei einen dieser Stellen auf ein Leerzeichen, wird es durch die Sollbruchstelle ersetzt - auch wenn da gar nicht gebrochen wird. Somit werden einige Leerzeichen verschluckt.
Deswegen habe ich es später ja auch mit chunk_split($str,1,"&shy;<wbr>"); versucht (fügt nach jedem Zeichen eine Sollbruchstelle ein), das Ergebnis habe ich oben ja schon erklärt.

Ein zusätzliches Problem ist, dass ich nicht weiß, wie viele Zeichen Text in einer Reihe dargestellt werden können, da es von der Länge des Usernamen abhängt. Zudem ist die erste Zeile kürzer als die darauffolgenden:
Zitat
User: Text Text Text Text Text
Text Text Text Text Text Text
Text Text Text Text Text Text

Berechnen kann man die Länge auch nicht so einfach, da ich eine proportionale Schriftart verwende und demnach jeder Buchstabe eine andere Breite hat.

Ich wüsste nicht, wie ich wordwrap() benutzen sollte, ohne dass Leerzeichen verschluckt werden oder unnötig gebrochen wird (<br> statt Sollbruchstelle).

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Das kann ich nicht bestätigen. Wenn ich nur &shy; verwende, bricht Firefox nichts - Opera jedoch schon. Firefox versteht nur <wbr>, was Opera allerdings nicht kennt.

Vielleicht ein CSS-Problem? Dass der FF3 &shy; beherrscht, steht außer Frage ;)

wordwrap() macht was, aber leider nicht das, was ich will.

Da haben sich schon einige Leute Gedanken dazu gemacht. Schau mal unter http://de3.php.net/wordwrap nach, da findest du einige Alternativen.

Deswegen habe ich es später ja auch mit chunk_split($str,1,"&shy;<wbr>"); versucht (fügt nach jedem Zeichen eine Sollbruchstelle ein)

Sicher keine gute Idee, denn die Worttrennung ist dann möglicherweise katastrophal. Lieber den Text mittels Aspell o.ä. durchforsten und die Bruchstellen setzen lassen.

Ein zusätzliches Problem ist, dass ich nicht weiß, wie viele Zeichen Text in einer Reihe dargestellt werden können, da es von der Länge des Usernamen abhängt.

Könnte man im Zweifel mit JavaScript ausmessen.

greez 8)
JoSsiF
Vielleicht ein CSS-Problem? Dass der FF3 &shy; beherrscht, steht außer Frage ;)

Selbst in einer test.html ohne CSS wird nichts gebrochen:
<table border="1" width="1px">
<tr><td>
Dieser&shy;Text&shy;Sollte&shy;Nach&shy;Jedem&shy;Wort&shy;Gebrochen&shy;Werden.
</td></tr>
</table>
Bei mir sieht es denn so aus: . Opera brichts korrekt.

Da haben sich schon einige Leute Gedanken dazu gemacht. Schau mal unter http://de3.php.net/wordwrap nach, da findest du einige Alternativen.

Danke für den Tipp. Ich habe mir jetzt folgenden Code herausgesucht:

function wrapper($str, $max, $break)
{
$len=strlen($str);                // getting length of the string.
if($len>$max){                     // if length < our max word lenght then do nothing.
$limited = str_split($str,$max);         // spliting our string into array
$maxrows=$len/$max;          // number of elements in array
$i=0;                          // while counter
while($i<$maxrows){             // check all elements of array one by one
$numofspaces = substr_count($limited[$i]," ");// checking if theres whitespace in element of array
if($numofspaces<1){$limited[$i] .= "$break";}// if theres no whitespace adding our $break to this element.
$i=$i+1;                            // counter
}
return implode("",$limited);
}
return $str;
};
Diese Funktion geht jedes Wort in $str durch. Wenn das Wort länger als $max ist, wird ein $break eingefügt.
Das ist schon besser als ganz ohne Wordwrap. Allerdings wird ein "WWWWW..." passend gebrochen, wobei ".......", also normale Punkte, zu früh gebrochen werden, da diese ja viel weniger Platz als die Ws brauchen. Gibt es da noch eine Möglichkeit, das zu lösen?

Sicher keine gute Idee, denn die Worttrennung ist dann möglicherweise katastrophal.

Genau deswegen suche ich ja auch eine Alternative ^^.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Selbst in einer test.html ohne CSS wird nichts gebrochen:

Genau das meinte ich. Die Tabelle wird in die Breite gedrückt. Mit korrektem CSS passiert das aber nicht.

<div style="width:10px;">
Dieser&shy;Text&shy;Sollte&shy;Nach&shy;Jedem&shy;Wort&shy;Gebrochen&shy;Werden.
</div>

...funzt im FF3 problemlos.


Das ist schon besser als ganz ohne Wordwrap. Allerdings wird ein "WWWWW..." passend gebrochen, wobei ".......", also normale Punkte, zu früh gebrochen werden, da diese ja viel weniger Platz als die Ws brauchen. Gibt es da noch eine Möglichkeit, das zu lösen?

Lässt sich wie gesagt mittels JS ausmessen. Zum Beispiel so: http://snipplr.com/view/9703/fit-string-to-width/

Du kannst dir auch die Mühe machen, jedes Zeichen auszumessen und in einem Skript zu hinterlegen, welches dir dann die zu erwartende Breite ausrechnet. Das funktioniert natürlich niemals exakt, weil auf dem Client immer irgendein Detail anders dargestellt werden könnte. Du könntest auf die Art aber eine Art Gewichtung für einzelne Zeichen entwickeln, die letztendlich eine ungefähre Abschätzung der zu erwartenden String-Breite erlauben. Übersteigt eine Zeichenkette die dafür explizit berechnete zu erwartende Länge, fügst du eine Bruchstelle ein. Dem Ganzen würde ich noch einen Check vorschalten, der die maximale Anzahl an zusammenhängenden Zeichen unter der Annahme maximaler Zeichenbreite abprüft und nur bei Überschreitung die tatsächliche Breite kalkuliert. Sonst steigt die Serverlast ins Unermessliche.

greez 8)
JoSsiF

« Myspace BesucherWindows XP: HP erscheint immer noch nicht bei google »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!