SMS Archiv

27o8

abgemeldet
2 Mai 2006
9.028
933
Im SMS Archiv haben die versendeten SMS keine Zeilenumbrüche, der komplette Text ist in einer Zeile und läuft sogar außerhalb vom Content weiter bis ins Menü.

Im Menü lassen sich dann auch keine Links mehr klicken, weil der Text darüber liegt Oo

Insgesamt sieht das sehr seltsam aus, und ist bestimmt auch nicht so gewollt :ugly:

*edit*
Liegt aber wohl an einer SMS die ich verschickt habe, komplett ohne Leerzeichen :ugly: wordwrap() könnte man da noch einsetzen ^^
 
wordwrap() ist insofern doof, als dass das nach X strikt zeichen umbricht, aber nicht berücksichtigt, dass der text an sich vorher auch schon vllt. von selbst umgebrochen ist. oder hab ich was übersehen? man bräuchte sowas:
PHP:
if(letzter_umbruch_liegt_mehr_als_x_zeichen_zurück) force_umbruch()
 
Also ich nutze folgende Funktion welche ich mal im Web gefunden habe:

PHP:
function breakLongWords($str, $maxLength, $char){
    $wordEndChars = array(" ", "\n", "\r", "\f", "\v", "\0");
    $count = 0;
    $newStr = "";
    $openTag = false;
    for($i=0; $i<strlen($str); $i++){
        $newStr .= $str{$i};   
       
        if($str{$i} == "<"){
            $openTag = true;
            continue;
        }
        if(($openTag) && ($str{$i} == ">")){
            $openTag = false;
            continue;
        }
       
        if(!$openTag){
            if(!in_array($str{$i}, $wordEndChars)){//If not word ending char
                $count++;
                if($count==$maxLength){//if current word max length is reached
                    $newStr .= $char;//insert word break char
                    $count = 0;
                }
            }else{//Else char is word ending, reset word char count
                    $count = 0;
            }
        }
       
    }//End for   
    return $newStr;
}

// Beispiel
breakLongWords($message,17,'<br/>')

Denke mal damit dürfte es auch "schön" gehen, wobei ich das genutzt habe um geöffnete HTML Tags nicht zu unterbrechen, aber kannst du ja hier - ggf. leicht modifiziert - auch einsetzen :)
 
Schon eher das was wir brauchen. Wir wollen ja nicht nach X Zeichen breaken, sondern quasi nur "böse lange Wörter" unschädlich machen. Ich finde eine Lösung mit <wbr> recht nice, weil das keine Spaces added (jaja denglisch). Weiß nur nicht, ob sich alle Browser dran halten. ("break here if you want ...").
PHP:
function fWrap ( $vText, $vMax ) { 
    $vWords = explode(" ", $vText); 
    foreach ( $vWords as $i =>$w ) { 
        if ( strlen ( $vWords[$i] ) > $vMax ) { $vWords[$i] = wordwrap( $vWords[$i], $vMax, "<wbr>", 1 ); } 
    } 
    return implode(" ", $vWords); 
}
 
Hier mein Improvement, dass HTML-Tags nicht gebreakt werden.
Ist drin und scheint in allen gängigen Browsern zu funzen.
Gegenteiliges bitte melden!

PHP:
// insert spaces in long words to allow wrap
    // take care of html-tags
    function fWrap ( $vText, $vMax ) { 
       foreach(explode(" ", strip_tags($vText)) as $key => $line){
            if(strlen($line) > $vMax) $vText = str_replace($line, wordwrap($line, $vMax, " ", 1), $vText);
        }
        return $vText;
    }
Edit: IE und Opera können <wbr> natürlich nicht. -.-
Dann halt mit Space ...

@Coder
Man könnte dieses Wort-Array auch vorher auf Duplikate filtern, oder? Es werden ja beim 1. Mal dann schon alle Vorkommen ersetzt. Ist aber wahsrcheinlich aufwändiger, als evtl. 1-2. unnötige str_replace() mehr.
 
Hier mein Improvement, dass HTML-Tags nicht gebreakt werden.
HTML:
<a href="https://www.eine-ganz-ganz-lange-url.com/und-noch-ein-langer-pfad/bis-zur-datei.endung">Link</a>
Das müsste doch theoretisch auch gebreakt werden. Wird zwar in einer SMS nicht vorkommen, aber ggf. an anderen Stellen wo du das noch einsetzen könntest.

*edit*
Sieht übrigens wieder schön aus (im FF)
 
HTML:
<a href="https://www.eine-ganz-ganz-lange-url.com/und-noch-ein-langer-pfad/bis-zur-datei.endung">Link</a>
Das müsste doch theoretisch auch gebreakt werden
Nein, denn das Innere des Tags wird ja nicht dargestellt. Ob das im Quelltext lang ist, ist ja wurscht ... oder meinst Du was anderes?
 
Ja das wird nicht angezeigt, aber es würde dann z.B. innerhalb vom href Attribut einen Zeilenumbruch geben, denn es wird ja der String als ganzes genommen, und nicht geprüft ob das nun nur "Code" oder auch "Ausgabe" ist.
 
Schau Dir nochmal den Code an
PHP:
// insert spaces in long words to allow wrap
    // take care of html-tags
    function fWrap ( $vText, $vMax ) { 
       foreach(explode(" ", strip_tags($vText)) as $key => $line){
            if(strlen($line) > $vMax) $vText = str_replace($line, wordwrap($line, $vMax, " ", 1), $vText);
        }
        return $vText;
    }
Ich mache strip_tags() und ziehe nur die Wörter in betracht, die danach noch übrig sind. Die ersetze ich dann per str_replace. Sollte also HTML-secure sein.

Edit: Worst case:
HTML:
<a href="laaaaaaaaaaaaaaaaaaaaang">laaaaaaaaaaaaaaaaaaaang</a>
Da das str_replace() ja auf den Urtext angewendet wird, würde in diesem Fall auch der Link an sich ersetzt werden, weil es das gleiche Wort ist wie das lange ... aber sowas kommt imho nie vor. Man könnte Den Urtext auch in Code-Stückchen und Wörter-Stückchen zerlegen, die Wörter dann einzeln ersetzen und danach wieder mit den Code-Stückchen joinen. Ist aber wesentlich aufwändiger zu coden.
 
Klar kannste nutzen. Aber siehe mein Edit. GANZ sauber ist das nicht ... tut aber. Ich hasse so Fälle, die so gut wie NIE vorkommen aber WENN dann gehts kaputt. Dann bastel ich meist ne Woche dran rum - nur um ein Stück quasi-toten Code zu produzieren. Beruhigt halt das Gewissen dann, mehr nicht. ;)
 
Wenn ich das richtig verstehe, wird der Code nicht nur im SMS-Archiv verwendet sondern auch bei Kommentaren, ist das richtig? Das ist jedenfalls der Grund warum ich es hier reinposte.

Es tritt ein unschöner Effekt auf wenn man ein langes Wort und danach ein Anführungszeichen hat. Das wird in die Entity " umgewandelt und selbige kann dann unterbrochen werden. Dann wird sie natürlich nicht mehr umgewandelt und das sieht ganz doof aus.

Beispiel: Mönchhofstraße!" :arrow: Mönchhofstraße!&quo t;

Falls hier falsch dann sorry, ein "Bug" ist es trotzdem.


P.S.: Man dankt für den Prem-GS! :mrgreen:
 
Jap ist ein Bug.

Ich muss das Spacer-Ding zuerst anwenden und danach Entities.
Wird gefixt.