Vorab:
Code: Alles auswählen
$Pattern = '/(.*)(' . $HighLight . ')(.*)/i';
$Replace = '$1<b>$2</b>$3';
die sachen am anfang und ende sind überflüssig ... da ja eh nur nach dem eigentlichen Wort gesucht werden soll reicht:
Code: Alles auswählen
$Pattern = '/(' . $HighLight . ')/i';
$Replace = '<b>$1</b>';
Zum Problem, es geht leider nicht , einfach nach einem < zu suchen und zu prüfen ob es davor ist, weil dann eben einfach n keinere Auswahl genommen wird.
Stattdessen würde ich prüfen ob sichergestellt ist das nach einem Wort ein < kommt und kein > ...
Da alles in <body> steht, sollte das klappen:
Code: Alles auswählen
$OldHTML = '<body>aber <img src="Laber"> Laber aber Laber</body>';
$HighLight = 'Laber';
$Pattern = '/(' . $HighLight . ')(?=[^\>]*\<)/i';
$Replace = '<b>$1</b>';
$NewHTML = preg_replace($Pattern, $Replace, $OldHTML);
Ergebnis
Das img hat immer noch den verweis auf "Laber"
<body>aber <img src="Laber"> <b>Laber</b> aber <b>Laber</b></body>