20. august 2003 - 23:59Der er
6 kommentarer og 1 løsning
Funktion til tekst-forkortelse - kan det gøres smartere?
Hej eksperter
Jeg har bikset lidt med standardopgaven at forkorte en lang tekst og gøre den præsentabel - dvs. standardeksemplet med at forkorte en nyhedstekst til et nærmere angivet antal karakterer og tilføje ... og et link til hele nyheden.
Jeg er endt op med følgende funktion, der kan tage lidt forskellige input som kan ændre på resultatet:
/** * * { Funktion der afkorter tekststykker til en ønsket længde på en "pæn" måde - til brug i eksempelvis nyhedsresumeer og lignende } * * @param integer $desiredlength - Ønsket længde på teksten * @param integer $tolerance - Tolerance på den ønskede længde dvs. teksten skal brydes indenfor $desiredlength+-tolerance * @param mixed $delimiterchars - De karakterer der kan brydes på i teksten. Flere karakterer angives i array. * @param string $enddelimiters - Hvilke tegn skal bruges som afslutter - standard er ... */ function CutTextNeatly($text, $desiredlength = 100, $tolerance = 10, $delimiterchars = ' ', $enddelimiters = '...') { if (strlen($text) > $desiredlength) { $text = substr($text, 0, $desiredlength+$tolerance); if (!is_array($delimiterchars)) { for ($i = 0; $i <= $tolerance; $i++) { if ($text[$desiredlength+$i] == $delimiterchars) { $breakpos = $desiredlength + $i; break; } elseif ($text[$desiredlength-$i] == $delimiterchars) { $breakpos = $desiredlength - $i; break; } } } else { for ($i = 0; $i <= $tolerance; $i++) { if (in_array($text[$desiredlength+$i], $delimiterchars)) { $breakpos = $desiredlength + $i; break; } elseif (in_array($text[$desiredlength-$i], $delimiterchars)) { $breakpos = $desiredlength - $i; break; } } } if (!isset($breakpos)) $breakpos = $desiredlength; $text = substr($text, 0, $breakpos) . $enddelimiters; } return $text; } // end func CutTextNeatly
Jeg vil gerne høre om nogen har forslag til forbedringer eller ændringer, da det er en funktion der vil blive brugt rigtigt meget og derfor er selv en 10% hastighedsforøgelse værd at tage med :-)
Jeg har nu selv skrevet den om, således at de karakterer der må brydes på angives i en string og ikke i et array, hvis der var flere af dem./** * CutTextNeatly() * { Funktion der afkorter tekststykker til en ønsket længde på en "pæn" måde - til brug i eksempelvis nyhedsresumeer og lignende } * * @param integer $desiredlength - Ønsket længde på teksten * @param integer $tolerance - Tolerance på den ønskede længde dvs. teksten skal brydes indenfor $desiredlength+-tolerance * @param string $delimiterchars - De karakterer der må brydes på i teksten. Der kan angives en eller flere karakterer. * @param string $enddelimiters - Hvilke tegn skal bruges som afslutter - standard er "..." */ function CutTextNeatly($text, $desiredlength = 100, $tolerance = 10, $delimiterchars = ' ', $enddelimiters = '...') { if (strlen($text) > $desiredlength) { $text = substr($text, 0, $desiredlength+$tolerance); if (strlen($delimiterchars) == 1) { for ($i = 0; $i <= $tolerance; $i++) { if ($text[$desiredlength+$i] == $delimiterchars) { $breakpos = $desiredlength + $i; break; } elseif ($text[$desiredlength-$i] == $delimiterchars) { $breakpos = $desiredlength - $i; break; } } } else { for ($i = 0; $i <= $tolerance; $i++) { if (strpos($delimiterchars, $text[$desiredlength+$i]) !== false) { $breakpos = $desiredlength + $i; break; } elseif (strpos($delimiterchars, $text[$desiredlength-$i]) !== false) { $breakpos = $desiredlength - $i; break; } } } if (!isset($breakpos)) $breakpos = $desiredlength; $text = substr($text, 0, $breakpos) . $enddelimiters; } return $text; } // end func CutTextNeatly
OK - jeg havde ellers næsten købt den... - hvilken der "vinder" må vist afhænge lidt af længeden af det tekststykke den fodres med - men et andet problem er at styre tolerancen ordentligt sammen med strpos() - det kan jeg ikke se, hvordan det skulle grejes! (Jeg går ikke udfra du vil have den i stedet for '==', men snarere vil bruge den i stedet for gennemløbet af $text[] med for-løkken.
ok, ved godt det er overskruet - men jeg har leget med koden, tilføjet lidt leg med evt html i strengen. Jeg har ikke benchmarked endnu og har slet ikke udført grundig test eller kodeoptimeret
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.