String kürzen aber nicht im Wort
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abschneiden
anfang
array
aufruf
ausdruck
beispiel
beschreibung
code
datum
ende
funktion
kleiner fehler
kurz form
kurzform
string
tip
treffer
verwenden
wort
zeichenkette
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
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 :) -
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:
also bis zum letzen Leerzeichen vor Trefferaaaaaa bbbbbb cccccc dddddd
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"; // -----------------------------------------------
-
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 -
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 ... -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage