[php] Nieuwsitems efficient inkorten *

Pagina: 1
Acties:
  • 284 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
naar aanleiding van een ander topic waar ik te ver afdwaalde van het oorspronkelijke topic.. hieronder mijn probleem.
Verwijderd schreef op 17 december 2003 @ 11:24:
Ik gebruik het voor mijn CMS, en dan moeten de nieuws-items na een bepaald aantal in te stellen characters worden afgebroken. De strings kunnen dus pas worden afgebroken als de pagina wordt bekeken. Het probleem is echter dat er dan ook plaatjes voorkomen in de tekst, zoiets dus:
PHP:
1
2
$news_content = "Hey, moet je dit plaatje zien!! --> 
[img]\"plaatje.gif\"[/img] Wow dat is echt een leuk plaatje!!";

ik gebruik nu:
PHP:
1
2
3
4
5
6
7
        if ($_SETTINGS['afkappen'] == 1) { 
            if (strlen(strip_tags($news_content)) > $_SETTINGS['hoeveelafkappen']) { 
                $news_content = substr($news_content,0,$_SETTINGS['hoeveelafkappen']); 
                $news_content .= "... 
                <a href='".$prefix."news_content.php?news_id=".$news_id."'>Lees verder</a>"; 
            } 
        }


Alleen als je hier afbreekt na 40 tekens, wordt er midden in de htmlcode afgebroken, en dat is natuurlijk niet de bedoeling.. Heeft iemand hier een oplossing voor?? :)
naar aanleiding van een antwoord van misterdata:
Verwijderd schreef op 19 december 2003 @ 15:52:
de bedoeling is dus dat ik met preg_split mijn string in een array opsplits in HTML-tags en tekst. Dus dat ik zoiets krijg:

PHP:
1
2
3
$array[0] = "Blaat, blaat, ";
$array[1] = "[img]'schaap.gif'[/img]";
$array[2] = "Blaatschaap!";


Echter worden er dmv deze regel code:

PHP:
1
$news_array = preg_split("/(<)([^<>]*)(>)/",$news_content);


alleen 'gezuiverd' van HTML-tags :S
Ik heb al alle flags geprobeerd van http://nl3.php.net/preg_split maar deze zijn geen van allen goed... iemand een oplossing? :)

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
Wat die flag betreft: kijk nog maar eens goed naar PREG_SPLIT_DELIM_CAPTURE.

Acties:
  • 0 Henk 'm!

Verwijderd

Onderzoek eens het verschil tussen de volgende 2 stukjes code.

<div>
Een heel lang zinnetje met allemaal onzin dat natuurlijk de layout niet mag verknoeien
</div>

<div style="width: 200px; max-width: 200px; white-space: nowrap; overflow: hidden;">
Een heel lang zinnetje met allemaal onzin dat natuurlijk de layout niet mag verknoeien
</div>

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Werkt prima, maar hakt wel midden in een zin af.. zou mooi zijn als ie uitrekent na een bepaalt woord te stoppen en dan nog met puntjes aan te vullen

Acties:
  • 0 Henk 'm!

Verwijderd

Probeer dat dan maar eens te doen. Realiseer hoeveel werk dat is en bezin of het de moeite was.

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
ja tuurlijk heb je ook gelijk in... :)

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Wat je zoekt is een algoritme, niet noodzakelijkerwijs PHP. Wat je wil is de input in ondeelbare brokken scheiden. Die brokken hebben een gegeven lengte (tekst is simpel, wat je met plaatjes wil weet jij alleen). Wat je dus in een loopje doet is beginnen met een lege sting, en net zolang brokken toeveoegn als je kunt zonder de lengte te overschrijden.

code:
1
2
3
4
5
6
PREFIX = ""
WHILE PREFIX + LENGTH( NEXT_BLOCK ) < MAX_LENGTH
{
    PREFIX = PREFIX + NEXT_BLOCK
    NEXT_BLOCK = AFTER(NEXT_BLOCK)
}

Twee stukje intelligentie nodig: Wat is volgens jou een ondeelbaar blok, en hoe lang is het?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 18-09 16:51
Twee stukje intelligentie nodig: Wat is volgens jou een ondeelbaar blok, en hoe lang is het?
Dat stukje intelli is wel te verzorgen met wat geregex. Wil je overigens wel de afbeeldingen die in de tekst van je nieuwsbericht staan weergeven? Dat lijkt mij namelijk niet zo handig...

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
if(strlen($news) > 50) { // Als de tekst string uit de database groter is dan 50 tekens. 
 $news = rtrim(substr($news,0,150))."..."; // Kort de string in naar 150 karakters en voeg daar achter ... 
  }


:/

Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Verwijderd schreef op 20 december 2003 @ 19:13:
PHP:
1
2
3
if(strlen($news) > 50) { // Als de tekst string uit de database groter is dan 50 tekens. 
 $news = rtrim(substr($news,0,150))."..."; // Kort de string in naar 150 karakters en voeg daar achter ... 
  }


:/
Als je met jouw functie dit gaat afkorten:
HTML:
1
blaaaat &euro;


kan het zijn dat je dit eruit krijgt:

HTML:
1
blaat &e...


en dat mag natuurlijk niet.... ook krijg je gezeur met html entities etc ;)


Wat je dus moet doen is je tekst opdelen in 'ondeelbare brokken': zo is € in zijn geheel ondeelbaar en is de tekst 'blaaaaa' wel deelbaar. Je moet dat dus op de een of andere manier in een array kunnen krijgen. Vervolgens ga je met de manier van MSalters door je string heen :)
quote: MSalters
Twee stukje intelligentie nodig: Wat is volgens jou een ondeelbaar blok, en hoe lang is het?
Een ondeelbaar blok is een blok waarin:
- slechts een html entity voorkomt (regex laat je dus zoeken op iets dat begint met '&' en eindigt met ';')
- slechts een HTML-tag met eventuele attributen voorkomt (daar zijn zat regexen voor)

Een deelbaar blok is een blok waarin geen HTML constructies voorkomen.

[ Voor 47% gewijzigd door MisterData op 20-12-2003 19:21 ]


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Ik dacht zelf dat woorden ook ondeelbaar zouden zijn. Misschien wil je ook wel dat € 200,- ondeelbaar is. Maar goed, dat is allemaal een keuze.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1