[php] Highlighten search woorden met behoud case

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 22:04
Ik ben ongeveer al een middag aan het prutsen om een routine te maken die woorden kan highlighten in een tekst die gezocht zijn met een search.

Er kwamen hierbij een hoop complicaties aangezien woorden die in HTML tags voorkomen niet gehighlight moesten worden!
Dit heb ik met behulp van een preg_split opgelost

Ik heb nu het volgende geprogged:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
// Split alle teksten buiten de HTML tags
$parts = preg_split('#(<\/?)(\w+)([^>]*>)#mis', $input, -1, PREG_SPLIT_NO_EMPTY);

// Highlight in alle parts alle woorden
for ($i = 0; $i < count($parts); $i++) {

   // Highlight alle woorden in de array $hl_words staan de woorden die
   // gehighlight moeten woorden
   for ($j = 0; $j < count($hl_words); $j++) {
      // replace woorden in $parts[$i]
   }
}


Het probleem zit 'm in het replacen.
Ik zou met een replace een voor een het woorden array kunnen aflopen en kunnen gaan replacen in het parts array.

Echter soms beginnen de woorden met een hoofdletter een andere keer niet etc.
Ik wil dit de case in takt laten, maar ik heb geen idee meer met welke (regular expressions) replace statement ik dit zou kunnen oplossen.

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

PHP:
1
2
3
$string =   preg_replace(   "/(>|^)([^<]+)(?=<|$)/esx",
     "'\\1'.preg_replace('/". preg_quote(preg_quote($keyword,'/'),'/') ."/i','<span class=highlight".$i.">\\\\0</span>','\\2')", 
    $string);


Hij staat nog ergens hier in GoT (credit to Arien)
Maar dit wordt in react hier gebruikt, en hij is case-insensitive met de replace. (je verliest je case niet)

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
de korte versie:
PHP:
1
preg_replace("/($high)/i", "<FONT color=\"#FF0000\">$1</FONT>", $input);

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Wat BasieP geeft is idd een aanvulling op wat je nu al hebt, wat ik gaf is een volledige highlighter die wellicht efficienter is/kan zijn.

Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 22:04
Die Regex ziet er lekker ingewikkeld uit ACM :P
Maar thanks ik zal zal 'm straks even uitproberen.

[ Voor 0% gewijzigd door pjonk op 19-11-2002 17:01 . Reden: typo's ]

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

JonkieXL schreef op 19 november 2002 @ 17:01:
Die Regex ziet er lekker ingewikkeld uit ACM :P
Maar thanks ik zal zal 'm straks even uitproberen.

Je moet hem iig in twee delen bekijken :)
Wat jij opgesplitst hebt doet deze stiekem "in een", eerst dus alle "niet-html-tags" opzoeken en daarna daarin replaces gaan doen.

Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 22:04
Hij werkt verder lekker maar indien je een quote in je woordjes gebruikt gaat de regex over z'n nek. Bijvoorbeeld als je zoekt naar logo's
Fatal error: Failed evaluating code: '>'.preg_replace('/logo\\'s/i','\0',' ')

Toch wel vreemd aangezien de quote wel geescaped wordt.
Ik zie trouwens dat GoT de quotes gewoon negeerd indien deze in de query worden gebruikt

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

De quote wordt dubbel geescaped zo te zien. het kan zijn dat dat juist 2x of juist 1x gedaan moet worden. Daarvoor moet je even rustig er naar kijken, zo te zien maar 1x.

Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 22:04
Volgens mij zitten die dubbele backslashes 'm in dit stukje:
preg_quote(preg_quote($keyword,'/'),'/')

Hij gaat dus dubbele de speciale reg chars escapen.
Als ik slechts 1 keer preg_quote gebruik gaat het wel goed

It’s nice to be important but it’s more important to be nice

Pagina: 1