kostenloser Webspace werbefrei: lima-city


String kürzen aber nicht im Wort

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    handytop

    handytop hat kostenlosen Webspace.

    Hallo

    ich habe einen kleinen Code, der einen String kützt, aber nicht mitten im Wort abschneidet,

    $kurz_besch[$p] = (strlen($daten[$p][BESCHREIBUNG]) > $length) ? substr($daten[$p][BESCHREIBUNG], 0, strrpos(substr($daten[$p][BESCHREIBUNG], 0, $kurz_besch_length+1), ' '  )): $daten[$p][BESCHREIBUNG];


    das funktioniert auch ... ABER ...

    wenn der String nicht "zu lang" ist, dann wird trotzdem immer das letzte Wort abgeschnitten
    was kann ich dagegen tun ?


    EDIT: jetzt wo ich den Code mal so einzeln sehe ist es klar ;)
    ... Fehler gefunden: anstatt $length muss dort auch $kurz_besch_length stehen
    :) ...
    erledigt, ... evtl kann den Code ja noch jemand anderes hier gebrauchen

    Beitrag zuletzt geändert: 6.3.2011 23:34:37 von handytop
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ein kleiner Tipp: Es ist besser wenn du den Code mit den if-else-Blöcken ausschreibst. Eine solch lange Zeile mit ternärem Konditionaloperator ist extrem unübersichtlich. Wahrscheinlich wäre der Fehler gar nicht erst passiert wenn du das von Anfang an sauber gemacht hättest.
  4. Autor dieses Themas

    handytop

    handytop hat kostenlosen Webspace.

    Hallo

    ... nicht getestet, aber so müsste es dann ausgeschrieben sein:

    $besch_string = "aaaaaaaa aaabb bbbbb bbbbbbbbb cccccccc cccccc ccccdddddd eeee"; 
    $kurz_besch_length = 20; 
    
    if ( strlen($besch_string > $kurz_besch_length ) ) { 
    $abschneiden = strrpos( substr($besch_string, 0, $kurz_besch_length+1), ' ' ); 
    $kurz_bstring = substr($besch_string, 0, $abschneiden);  // ---- mit Kuerzung---- 
    }
    else {
    $kurz_bstring = $besch_string;  // ---- ohne Kuerzung---- 
    }
    
    echo $kurz_bstring;


    wobei ich die auch die Variablen noch etwas "vereinfacht" habe, nicht in Array/Schleife
    ... also $besch_string anstatt $daten[$p][BESCHREIBUNG] ...

    Kurzform:
    $kurz_besch = (strlen($besch_string) > $length) ? substr($besch_string, 0, strrpos(substr($besch_string, 0, $kurz_besch_length+1), ' '  )): $besch_string;
    
    echo $kurz_besch;


    EDIT ... habs doch mal getestet .... geht nicht, die ausgeschriebene Variante kürzt garnix :)
    aber die "Kurzform" funktioniert ?! ... whats wrong ?

    Beitrag zuletzt geändert: 7.3.2011 16:05:11 von handytop
  5. if ( strlen($besch_string > $kurz_besch_length ) ) {


    Du hast die strlen()-Klammer vergessen, zu schliessen, respektive zu spät geschlossen.

    if ( strlen($besch_string) > $kurz_besch_length) {


    Glaube so sollte das funzen :)
  6. Hallo

    weil ich das auch gesucht und hier gefunden habe,
    hier mal meine Version die auch funktioniert ... :)

    denn bei dem oben war ja ein kleiner Fehler drin.
    also Quasi nochmal als Zusammenfassung inkl. Beispiel.

    a) als Funktion:

    // ----------------------------------------------- 
    
    function short_string($str,$len) { 
    
    	if (strlen($str) > $len) { 
    		$cut = strrpos(substr($str, 0, $len+1), ' '); 
    		$out = trim(substr($str, 0, $cut)); 
    	}
    	else {
    		$out = $str; 
    	}
    	
    	return $out; 
    }
    
    // ----------------------------------------------- 
    
    // ---- Aufruf der Funktion mit Beispiel ---- 
    
    $max_leng = 30; 
    $long_str = 'aaaaaa bbbbbb cccccc dddddd eeeeee ffffff gggggg'; 
    
    $shortstr1 = short_string($long_str,$max_leng); 
    
    print "<p>".$long_str."</p>\n"; 
    print "<p>".$shortstr."</p>\n"; 
    
    // -----------------------------------------------


    Die Position 30 wäre hier nach dem zweiten "e" also Treffer wäre mitten im Wort.
    die Funkzion gibt zurük:
    aaaaaa bbbbbb cccccc dddddd
    also bis zum letzen Leerzeichen vor Treffer

    und die Kurz-Form:
    // ----------------------------------------------- 
    
    $max_leng = 30; 
    $long_str = 'aaaaaa bbbbbb cccccc dddddd eeeeee ffffff gggggg'; 
    
    // ----------------------------------------------- 
    
    // ---- Aufruf der Kurz-Form mit Beispiel ---- 
    
    $shortstr = (strlen($long_str) > $max_leng) ? trim(substr($long_str, 0, strrpos(substr($long_str, 0, $max_leng+1), ' '))) : $long_str; 
    
    // ----------------------------------------------- 
    
    print "<p>".$long_str."</p>\n"; 
    print "<p>".$shortstr."</p>\n"; 
    
    // -----------------------------------------------


  7. thomasba

    Co-Admin Kostenloser Webspace von thomasba

    thomasba hat kostenlosen Webspace.

    Eine relativ kurze Version mit ein paar Testfällen:

    <?php
    
    function k($s,$l=20) {
    	// Unnötige Leerzeichen an Anfang und Ende entfernen
    	$s = trim($s);
    	if(preg_match("/^(.{0,$l})( |$)/",$s,$m)) {
    		return $m[0];
    	}else{
    		return substr($s,0,$l);
    	}
    }
    echo k("aaaaaaaa aaabb bbbbb bbbbbbbbb cccccccc cccccc ccccdddddd eeee")."\n";
    echo k("aaaaaaaaaaaaaaaaaaabcccccccccccc")."\n";
    echo k("aaaaaaaaaaaaaaaaaaabcccccccccccc ")."\n";
    echo k("aaaaaae")."\n";
    echo k(" aaaaaae")."\n";
    echo k("aaaaa aaaaa aaaaaaab ccccccccccc")."\n";
    echo k("aaaaa aaaaa aaaaaaa cccccccccccc")."\n";
    echo k("aaaaa aaaaa aaaaaaabcccccccccccc")."\n";
    ?>


    Beim regulären Ausdruck werden 0-$l Zeichen erwartet und danach entweder ein Leerzeichen oder das Ende des Strings, trifft das nicht zu, wird der String einfach mit Substring gekürzt.

    Beitrag zuletzt geändert: 31.3.2013 11:23:28 von thomasba
  8. Hallo

    braucht ein preg_match nicht deutlich mehr Ressourcen als ein if (strlen($str) > $len)

    habe mal als Tipp gelesen (in der php doku)
    dass man möglichst auf preg_match verzichten soll wenn es Alternativen gibt.

    Tipp
    Verwenden Sie nicht preg_match(), wenn Sie nur überprüfen wollen, ob eine Zeichenkette in einer anderen Zeichenkette enthalten ist. Verwenden Sie dafür stattdessen die Funktionen strpos() oder strstr(), die das schneller erledigen.


    ich vermute mal das bezieht sich auch auf strlen() und nicht nur auf strpos() oder strstr()
    ... kann mich aber auch täuschen ...
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!