Ik gebruik de volgende functie om woorden in een string op een HTML-veilige manier te highlighten.
Zoals je ziet is de code vrij eenvoudig. Nu zit er één bugje in deze functie: wanneer er hoofdletters in de tekst in een wooord zitten dat gehighlight moet worden, gaan die verloren. Er komen dan gewoon kleine letters te staan. Dit is nogal storend bij het begin van zinnen, namen etc.
Het probleem zit 'm erin dat het me niet lukt om de backreferences van de binnenste preg_replace aan te spreken. \\1, de reference die ik zou moeten hebben, verwijst naar de buitenste preg_replace. Hoe pak ik toch de references van de binnenste?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| function highlight($keywords,$string) { $styles = array('color: #fff; background-color: #909;', 'color: #000; background-color: #ff6;', 'color: #000; background-color: #aff;', 'color: #000; background-color: #9f9;', 'color: #000; background-color: #f99;', 'color: #000; background-color: #f6f;', 'color: #fff; background-color: #800;', 'color: #fff; background-color: #0a0;', 'color: #fff; background-color: #860;', 'color: #fff; background-color: #049;', ); foreach($keywords as $keyword) { $style = next($styles); if (!$style) { $style = reset($styles); } $string = preg_replace("/(>|^)([^<]+)(?=<|$)/esx", "'\\1'.preg_replace('!\b(".preg_quote($keyword).")\b!i','<span style=\"background-color: ".$style.";font-weight: bold;\">".$keyword."</span>','\\2')", $string); } return $string; } |
Zoals je ziet is de code vrij eenvoudig. Nu zit er één bugje in deze functie: wanneer er hoofdletters in de tekst in een wooord zitten dat gehighlight moet worden, gaan die verloren. Er komen dan gewoon kleine letters te staan. Dit is nogal storend bij het begin van zinnen, namen etc.
Het probleem zit 'm erin dat het me niet lukt om de backreferences van de binnenste preg_replace aan te spreken. \\1, de reference die ik zou moeten hebben, verwijst naar de buitenste preg_replace. Hoe pak ik toch de references van de binnenste?