Avatar billede dennism Nybegynder
09. maj 2008 - 19:46 Der 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 :(
Avatar billede jakobdo Ekspert
09. maj 2008 - 21:31 #1
Hvis du vil af med html tags, kunne du så ikke smide teksten via strip_tags() inden du måler længden ?
Avatar billede dennism Nybegynder
09. maj 2008 - 21:52 #2
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.
Avatar billede jakobdo Ekspert
10. maj 2008 - 08:45 #3
Så det du vil, er at forkerte en tekst, hvor html tags ikke skal tælles med i længden ?
Avatar billede dennism Nybegynder
10. maj 2008 - 09:10 #4
Ja, præcis! Men de skal alligevel være der i den endelige tekst. Fik jeg formuleret det forkert?
Avatar billede terke Nybegynder
10. maj 2008 - 10:04 #5
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.

Håber denne ide kan bruges...
Avatar billede jakobdo Ekspert
10. maj 2008 - 10:10 #6
Jeg er ikke helt siker på om den er bullet-proff, men prøv lige:

<?php
//http://www.eksperten.dk/spm/830830

$text = '<strong>Her er noget tekst</strong> og her er noget mere tekst';

function textMaxLen($txt, $maxlength=50, $end='...') {
    $output = '';
    if(strlen($txt) > $maxlength){
        $htmlStart = false;
        $counter = 0;
        for($i = 0; $i < strlen($txt); $i++){
            if($txt[$i] == '<'){
                $htmlStart = true;
            }
            if($txt[$i] == '>'){
                $htmlStart = false;
            }
            if(!$htmlStart){
                $counter++;
            }
            $output .= $txt[$i];
            if($counter == $maxlength){
                break;
            }
        }
        $output .= $end;
    }else{
        $output = $txt;
    }
    return $output;
}

echo textMaxLen($text);

?>
Avatar billede nielle Nybegynder
10. maj 2008 - 10:41 #7
Hvad så hvis teksten er noget i denne stil:

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.
Avatar billede terke Nybegynder
10. maj 2008 - 10:59 #8
@nielle

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 :-/
Avatar billede dennism Nybegynder
10. maj 2008 - 11:10 #9
Præcis - også derfor jeg oprettede denne tråd :) Jeg har bøvlet lidt med det, og har måske en løsning her:

<?PHP
function textMaxLen($txt, $maxlength=50, $end='...') {
    $output = '';
    if(strlen($txt) > $maxlength){
        $htmlStart = false;
        $counter = 0;
        for($i = 0; $i < strlen($txt); $i++){
            if($txt[$i] == '<'){
                $htmlStart = true;
                                if($txt[($i+1)] != '/') $lastWasStartTag=true;
            }
            if($txt[$i] == '>'){
                $htmlStart = false;
            }
            if(!$htmlStart && $txt[$i] != '>'){
                $counter++;
            }
                       
            if($counter > $maxlength && $txt[$i]==" "){
                                if($lastWasStartTag) {
                                    $endTag = false;
                                    for($j = $i; $j < strlen($txt); $j++){                                   
                                        if($txt[$j] == '<' && $txt[($j+1)] == '/'){
                                            $endTag=true;
                                        }
                                        if($endTag) {
                                            $output .= $txt[$j];
                                           
                                        }
                                        if($txt[$j] == '>'){
                                            break;
                            }                           
                                    }
                                }
                                break;
            }
                        $output .= $txt[$i];
        }
        $output .= $end;
    }else{
        $output = $txt;
    }
    return $output;
}

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>";
?>

Hvad siger I? Vil den fungere?
Avatar billede jakobdo Ekspert
10. maj 2008 - 11:25 #10
Crap, ja der er jo heldigvis ingen som havde sagt det skulle være nemt! :o)
Avatar billede terke Nybegynder
10. maj 2008 - 11:32 #11
@dennism:

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...
Avatar billede dennism Nybegynder
10. maj 2008 - 11:37 #12
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 :(
Avatar billede terke Nybegynder
10. maj 2008 - 11:45 #13
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?
Avatar billede dennism Nybegynder
02. juni 2008 - 17:05 #14
Må jeg bede om et svar, jakobdo?
Avatar billede jakobdo Ekspert
02. juni 2008 - 17:35 #15
Svar!
Avatar billede jakobdo Ekspert
02. juni 2008 - 17:58 #16
Takker for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester