Avatar billede melange Nybegynder
06. juli 2005 - 20:50 Der er 16 kommentarer

problem med at afkorte nyhed

Jeg har et nyhedssystem, hvor jeg gerne vil afkorte hver nyhed til 1000 tegn. Dette er i sig selv ikke noget problem, og jeg brugte lavede følgende funktion jeg har skrevet:

function forkort_streng($string, $antal_tegn = 1000) { 
    $string = substr($string, 0, $antal_tegn); 
    $pos = strrpos($string, ' ' );
    $string = substr($string, 0, $pos);
    $string .= '...';
    return $string;

}

Noget jeg bare ikke havde overvejet var. Nu er det kun meget få og trovärdige personer som kan skrive nyheder, og derfor har jeg ladet nyhedssystemmet tillade HTML. Men! med overstående kode risikerer man jo at skäre teksten over "midt inde" i et html-tag, hvilket jo ikke er så smart.

Nogle gode løsningsforslag?
Avatar billede coderdk Praktikant
06. juli 2005 - 20:59 #1
At køre strip_tags() på den inden du kalder din funktion? :)
Avatar billede nielle Nybegynder
06. juli 2005 - 21:03 #2
Den er der ikke nogen let løsning på.

Eksempel: En person skriver et stort stykke tekst hvori der indgår en tabel. Grænsen på det 1000 tegn falder inde midt i tabellen. Betyder det at hele tabellen skal med, eller at den slet ikke skal med? For det er i hvertfald ikke nogen god ide at skære midt i tabellen.
Avatar billede melange Nybegynder
06. juli 2005 - 21:12 #3
coderdk: huh? så "ødelägger" jeg da bare al HTML'en?

nielle: ja, jeg ved godt kan väre et problem - men lad os antager at der kun bliver brugt "små tags" (links, fed skrift mm.). Om den så "runder op eller ned" er jeg egentlig ligeglad med.
Avatar billede coderdk Praktikant
06. juli 2005 - 21:15 #4
Slet ikke testet, men noget i stil med:

if ( strpos( '<', $tekst ) > 0 )
{
  $tekst = preg_replace( '/(.{1000}.*?(<\/.*?>))/', '\\1', $tekst );
}
else
{
  $tekst = forkort_streng( $tekst );
}
Avatar billede nielle Nybegynder
06. juli 2005 - 21:18 #5
Hvad så når der står sådan noget som:

... blah blah <b>Eksperten er bare så sej</b>  blah blah ...

- og der med grænsen på de 1000 tegn ville blive skåret efter ”så”. Ville dette tilfælde betyde at der skulle fjernes fra og med det indledende ”<b>”, eller først efter de afsluttende ”</b>”?
Avatar billede melange Nybegynder
06. juli 2005 - 21:40 #6
coderdk: nu er Reg.Exp ikke min stärke side, kan du uddyke lidt hvad den helt präcis gør :)

nielle: som jeg skrev før, men som måske ikke var helt klart, er jeg ret ligeglad om den "runder op eller ned".
Avatar billede nielle Nybegynder
06. juli 2005 - 21:44 #7
Ok, sidste spørgsmål. Når der f.eks. står:

... blah blah <br /> blah blah ...

- skal "<br />" så regnes med som 6 tegn, eller går grænsen på de 1000 tegn udelukkende på selve teksten?
Avatar billede cronaldo Nybegynder
06. juli 2005 - 21:45 #8
Det er kun selve teksten!
Avatar billede cronaldo Nybegynder
06. juli 2005 - 21:47 #9
Men hvis du nu var smart, så forkortede du i ord i stedet for tegn? Så kommer det ikke til at stå fx: hindb(*mangler*ærsyltetøj)
Avatar billede melange Nybegynder
06. juli 2005 - 22:18 #10
nille: igen er det ikke så vigtigt - 1000 tegn er ret meget, og brugen af HTML er ret beskeden

cronaldo:
1) af forkorte en tekst ned til 100 ord i stedet for 1000 tegn er bare besvärligt
2) Det er også problematisk da to sätninger på 100 ord kan have *meget* forskellige längder
3) Det løser stadig ikke mit problem.
4) Hvis du kigger på den funktion jeg postede i spørgsmålet vil du opdage at den faktisk også tager højde for det problem du nävner.
Avatar billede coderdk Praktikant
06. juli 2005 - 22:43 #11
Min skulle måske være:

$tekst = preg_replace( '/(.{1000}.*?(<\/.*?>)?)/', '\\1', $tekst );

Stadig ikke testet :)
Avatar billede coderdk Praktikant
06. juli 2005 - 22:44 #12
HOV! Måske endda:

$tekst = preg_replace( '/(.{1000}.*?(<\/.*?>)?)/s', '\\1', $tekst );
Avatar billede nielle Nybegynder
06. juli 2005 - 22:46 #13
Prøv denne her:

$tekstMedTags = "blah - blah - blah";
$forkortet = false;

$tekstUdenTags = strip_tags($tekstMedTags);
if (strlen($tekstUdenTags) > 1000)
{
    $forkortet = true;

    $tekstMedTags = substr($tekstMedTags, 0, 1000);

    $pattern = "^(.*)<[^\/][^<]*$";
    if preg_match("/$pattern/", $tekstMedTags, $matches)
    {
        $tekstMedTags = $matches[1];
    }
}

if ($forkortet) $tekstMedTags .= "...";
Avatar billede nielle Nybegynder
11. juli 2005 - 19:48 #14
Har du fået kigget på det?
Avatar billede nielle Nybegynder
19. juli 2005 - 20:45 #15
?
Avatar billede domaz.dk Novice
07. januar 2006 - 17:10 #16
ellers skal du lade den forkortede del være uden html tags... og den "lange" del kan så være med html-tagsne..?
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