// Tar emot ett sökord (str) och en sträng (str) att söka i
// Returnerar strängen där sökordet är markerat med <span>
// Funktionen tar hänsyn till HTML taggar (ev. markering görs ej inuti dessa)
function mark_string($search, $str)
{
// Den nya strängen
$new_str = "";
// HTML tags pattern
$pattern = "/([\<][\/]?[a|span|p|div|br|input|form].*?[ ]?[\/]?[\>])/";
// Hitta alla HTML taggar och spara dem i arrayen $matches
preg_match_all($pattern, $str, $matches);
// Dela upp innehåll som inte är inuti i en HTML tag
$content_arr = preg_split($pattern, $str);
// Gå igenom alla delar
foreach ($content_arr as $content)
{
// Markera alla förekomster av sökordet
$new_str .= preg_replace("/($search)/i", "<span>$1</span>", $content);
// Lägg till HTML tag
$new_str .= current($matches[1]);
// Nästa HTML tag
next($matches[1]);
}
// Returnera den nya strängen
return $new_str;
}
In action:
$str = "Ordet html i en <a href='html.php'>html tag</a> funkar bra!";
$search = "html";
echo mark_string($search, $str);
// Ordet <span>html</span> i en <a href="html.php"><span>html</span> tag</> funkar bra!
Rätt stolt att jag lyckats, för det fungerar precis så som jag vill.
Men, den går säkert att optimera, kanske rent ut av det går att göra en preg_replace som gör allt detta med en gång?
Tacksam för synpunkter och tips.
277 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e