09. maj 2008 - 19:46Der er
15 kommentarer og 1 løsning
PHP: forkort tekst
Jeg har et system, hvor jeg har nogle længere tekster. Jeg vil gerne have forkortet disse tekster, så de maksimalt indeholder f.eks. 50 tegn og afsluttes med "...". Det er ikke så vanskeligt at lave, men mit problemer er, at disse tekster også indeholder <html>-tags hvilke ikke skal tælle med i de 50 tegn.
Det kan f.eks. være: 1.: her er noget tekst 2.: <strong>her er noget tekst</strong>
Hvis jeg ønsker at køre funktionen på disse med maxlength=5, skal de begge bliver "her er...", da det sidste ord skal helst også gøre færdig! Håber det er til at forstå?
Jeg har lavet en PHP-kode som klarer alt dette, undtaget det med HTML-tags:
<?PHP function textMaxLen($var, $maxlength=50) { if (strlen($var) > $maxlength) { for ($newLength = $maxlength; substr($var,$newLength,1)!=" " && strlen($var)>$newLength ; $newLength++); return substr($var, 0, $newLength)."..."; } return $var; }
echo textMaxLen("Her er noget tekst",5)."<br>"; echo textMaxLen("<strong>Her er noget tekst</strong>",5)."<br>"; ?>
Håber der er nogen som kan hjælpe mig videre, så det kommer til at du med de HTML-tags :(
Jo, det kan jeg. Men hvad gør jeg så efterfølgende? Når jeg så finder ud af, at længden af "ren tekst" (altså teksten uden HTML) er længere end jeg ønsker vist, så skal jeg jo have forkortet denne. Det er også nemt nok, og jeg vil ende op med en string uden HTML-tags efter den er forkortet. Det dur jo ikke - de skal jo også være der efter de er forkortet.
Jeg ville nok gå de enkelte karakterer igennem én efter én (som du også gør), og så have en ekstra variabel der holder styr på om man skal tælle den nuværende karakter med som den del af de 50 tegn.
Denne variabel ($doCount) kan sættes til 0 når du rammer "<" og til 1 når du så rammer ">". Så ved du at når du står med et tegn, så er dette en del af et html-tag hvis $doCount = 0, og en del af almindelig tekst hvis $doCount = 1. Du skal selvfølgelig også holde styr på hvor langt du er i den oprindelige streng, så du kan tage den rigtige substring med 50 tegn + html-tags bagefter.
noget telst <b>noget tekst i bold ... *meget* mere tekst</b> efterfulgt af noget tekst som ikke er i bold.
- så ville man kunne resikere at få en uafsluttet <b> tag - dvs. at resten af siden er i bold. Blot et eksempel på hvad der kunbne ske hvis start-tags ikke følges op af en slut-tag.
Desværre kan jeg ikke selv lige give nogen pæn løsning på problemet.
Av av, det er godt observeret! Det bliver pænt bøvlet (i forhold til det ret simple formål at forkorte en streng) at holde styr på hvor mange (og hvilke) html-tags der er åbne :-/
echo textMaxLen("Her er noget tekst",5)."<br>"; echo textMaxLen("<strong>Her er noget tekst</strong>",5)."<br>"; echo textMaxLen("<font>hej med dig</font>",5)."<br>"; echo textMaxLen("<strong>h id fd4</strong>",5)."<br>"; ?>
Holder din kode styr på om alle html-tags er blevet lukket, eller undersøger den kun om det sidste var af typen </ ... >? For selvom sidste html-tag er et slut-tag, kan der jo stadig godt være andre der mangler at blive lukket...
Nej, det er rigtigt - den holder kun styr på det sidste! I første omgang troede jeg, at det var et "kendt problem", så jeg forsøgte at søge på google efter det. Men det lykkedes ikke mig at finde noget :(
Der er jo selvfølgelig altid den "naive" løsning, hvor man gemmer og tæller alle åbne tags - og så selv sørger for at indsætte manglende slut-tags. Men det kan stadig give noget rod i html-koden hvis sådanne tags nu indsættes et uhensigtsmæssigt sted. Tror det afhænger af hvilke tags du regner med kan fremkomme i de strenge der skal forkortes?!
Må man spørge hvad forkortelsen skal bruges til? Er det overhovedet nødvendigt at bevare html-syntaks?
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.