[PHP] HTML DOM parser -> Highlight woorden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Hey,

Om trefwoorden te arceren in forum berichten gebruik ik een HTML DOM parser om text te scheiden van html tags, zodat je hierna eenvoudig de tekst (en dus niet de html tags) kan arceren (zoals hier op GOT ook wordt gedaan).

Nu gebruik ik hiervoor "Simple HTML dom parser" (http://simplehtmldom.sourceforge.net/) en gebruik ik onderstaande code om woorden of woordgedeelten te arceren:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
require_once('inc/htmlparser.php');
                                
$bericht = str_get_html($bericht);

foreach($bericht->find('text') as $e) {
                            
$plaintext = $e->plaintext;
                    
$plaintext = str_ireplace($keywords,'<span class="highlighted_text">'.$replacedkeywords.'</span>',$plaintext);
                                                                
$e->outertext = $plaintext;
                                
}


Echter wanneer de array "keywords" bestaat uit het gehele alfabet (als voorbeeld) dan ontstaat er een memory leak error door de "str_ireplace". Nu heb ik op Google gezocht naar mogelijkheden om tekstgedeelten door de html dom paser te laten vervangen, maar helaas zonder resultaat.

Wat natuurlijk een oplossing is, is om het aantal keywords te beperken tot 10 (bijvoorbeeld), maar deze beperking wil ik zo veel mogelijk vermijden.

Kennen jullie een HTML Dom parser die ook tekst kan vervangen of is er een betere manier om trefwoorden in een tekst te arceren?

Acties:
  • 0 Henk 'm!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
Zou je niet beter preg_replace gebruiken (met een degelijke reguliere expressie) ipv str_ireplace?

Je bent immers op zoek naar woorden, niet naar strings. Jouw algoritme gaat nu ook in Autodealer "dealer" markeren als het een keyword is.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Wat is er mis met gewoon de hele HTML door str_replace te halen?

Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Wanneer ik de totale html door de str_replace haal en een trefwoord is bijvoorbeeld "img" dan worden de img tags ook gearceerd en krijg je dus een brakke output.

Ik heb het inmiddels opgelost door gebruik te maken van preg_replace. Een html dom parser was dus een beetje overbodig.
Tharulerz schreef op woensdag 07 april 2010 @ 18:37:
...
Jouw algoritme gaat nu ook in Autodealer "dealer" markeren als het een keyword is.
Dat is ook de bedoeling.

[ Voor 31% gewijzigd door radem205 op 07-04-2010 18:51 ]


Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 18-09 20:31
HuHu schreef op woensdag 07 april 2010 @ 18:43:
Wat is er mis met gewoon de hele HTML door str_replace te halen?
Als je bijvoorbeeld het keyword "style" een kleurtje wil geven, krijg je ongeldige html.

Die constructie met str_ireplace zou ik wel anders doen. Ik ben niet zo bekend met die library, die van php kun je ook gebruiken voor html.

Met die library (en dat zal met die van jou ook wel kunnen) kun je het volledig OOP afhandelen. Je maakt dan een nieuw object aan van het type DOMElement. Die geef je de gewenste tekst. Via een methode van dat object kan je het attribuut "class" de waarde "highlighted_text" meegeven. Vervolgens verwijder je de tekst en voeg je deze html-node aan je document toe. Daar komt geen string replacement-functie aan te pas.

offtopic:
Beter niet op "reply" klikken en vervolgens 10 minuten weglopen 8)7

[ Voor 5% gewijzigd door doeternietoe op 07-04-2010 19:05 ]


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
doeternietoe schreef op woensdag 07 april 2010 @ 19:04:
[...]

Met die library (en dat zal met die van jou ook wel kunnen) kun je het volledig OOP afhandelen. Je maakt dan een nieuw object aan van het type DOMElement. Die geef je de gewenste tekst. Via een methode van dat object kan je het attribuut "class" de waarde "highlighted_text" meegeven. Vervolgens verwijder je de tekst en voeg je deze html-node aan je document toe. Daar komt geen string replacement-functie aan te pas.
Hmm, klinkt logisch, maar wordt een behoorlijk uitpluiswerk om het werkend te krijgen, want er zijn ontzettend veel functies binnen de php DOM.

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 18-09 20:31
radem205 schreef op woensdag 07 april 2010 @ 19:22:
[...]


Hmm, klinkt logisch, maar wordt een behoorlijk uitpluiswerk om het werkend te krijgen, want er zijn ontzettend veel functies binnen de php DOM.
Het valt wel mee, als je de handleiding van php.net ernaast legt. Ik zou me echter de moeite besparen als het al met regular expressions is gelukt. Goeie kans dat het betere performance biedt dan de hele html aflopen voor een groot aantal keywords. :)

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
doeternietoe schreef op woensdag 07 april 2010 @ 19:04:
[...]

Als je bijvoorbeeld het keyword "style" een kleurtje wil geven, krijg je ongeldige html.
Je moet sowieso een spatie voor en na het woord doen om matches halverwege woorden te voorkomen, dus dan heb je al gegarandeerd geen matches meer met HTML tags.

Edit: oeps, ik zie nu dat delen van woorden matchen wel de bedoeling is.

[ Voor 9% gewijzigd door HuHu op 08-04-2010 08:39 ]

Pagina: 1